`
huahongluo
  • 浏览: 38146 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

java sax与base64字符封装的高级应用

阅读更多
   把电子文件流转成base64字符串然后封装到xml里面,然后读取以用sax顺序读取的方式把电子文件读取出来。
   因为sax是顺序读取xml的,不用整个xml加载到内存,解决xml大文件问题。
package com.base64.tool;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import titans.common.Constant;
/**
 * 大文件xml解板工具类
 * @author 珠海·李正球
 * @version 1.0 2012-07-20
 */
public class Base64readutil extends DefaultHandler{
	protected Logger log = Logger.getLogger(this.getClass()); // log4j
	private String qName=""; //元数据名称
	private String filename="";//文件名称
	private int pos=0;  //文件指针位置
	private FileWriter xmlFile =null;
	private StringBuilder outstr=null;
	private String filepath = "C:/";
	private StringBuilder base64Str = null; //存放非电子文件内容
	private StringBuilder base64File = null; //存放电子文件内容
	private final static int blocksize=256;//base64分块大小
	FileOutputStream out = null;
	
	private String eepfile=null;
	public Base64readutil(String eepfile )
	{
		this.eepfile=eepfile;
		
	}
	public Base64readutil(String eepfile,String path )
	{
		this.eepfile=eepfile;
		this.filepath = path;
	}
	
	@Override
	public void startDocument() throws SAXException {
		log.info("文档打开...");
		pos = 0;
		base64File  =new StringBuilder("");
		try {
			   //xmlFile = new FileWriter(this.eepfile,false);
			   outstr=new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
			   base64File=new StringBuilder("");
		} catch (Exception e) {
			log.error(e.getMessage());
		}
	}
	

	@Override
	public void endDocument() throws SAXException {
		log.info("文档结束....");
		try {
			Document document = DocumentHelper.parseText(outstr.toString().trim());
			OutputFormat xmlFormat = OutputFormat.createPrettyPrint();
	        xmlFormat.setEncoding("UTF-8");   
	        xmlFormat.setIndent("    ");
			
			XMLWriter output = new XMLWriter( new FileOutputStream(new File(eepfile)),xmlFormat);
		    output.write( document );
		    output.close();
			
		} catch (Exception e) {
			log.error(e.getMessage());
		}
	}
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		 String content="";
		 if(this.qName.trim().equalsIgnoreCase("计算机文件名"))
		  {
			 content=new String(ch,start,length);
			 if(content.trim().length()>0){
				  if( filename.lastIndexOf(".")==-1)
					  if(filename.trim().equalsIgnoreCase(""))
						  filename=((filepath.endsWith("/")||this.filepath.endsWith("\\"))?filepath:(filepath + "/"))+ content;
					  else
					      filename=filename+content;
				  else
				      filename=((filepath.endsWith("/")||this.filepath.endsWith("\\"))?filepath:(filepath + "/"))+ content;
		    	outstr.append(content);
		     }
		  }
		else if(this.qName.trim().equalsIgnoreCase("编码数据"))
		  {
			content=new String(ch,start,length);
			if(content.trim().length()>0){
			   log.info("元数据值:"+content);
			   base64Str.append(content);
			   base64File.append(content);
			   byte[] base64byte=null;
			   try {
					 //通过4位整数获取  start 
				     int total=base64File.length();
				     int i =total/blocksize;
				     if(total>blocksize)
				     {
				    	 for(int k=0;k<i;k++)
				    	 {
				    		 base64byte=Constant.decoderBase64(base64File.toString().substring(k*blocksize, (k+1)*blocksize));
						     downfile(base64byte,filename,pos,base64byte.length);
						     pos+=base64byte.length; 
				    	 }
				    	 if( this.base64File.length()>0 )
				    	    base64File.delete(0, blocksize*i);
				     }
                    // 通过4位整数获取  end
			
					 base64Str = new StringBuilder();
					 if(!base64Str.toString().equalsIgnoreCase(""))
		         	     out.write(Constant.decoderBase64(base64Str.toString()));
				} catch (Exception e) {
					// TODO 自动生成 catch 块
					log.error(e.getMessage());
				}
				 
		     }
			
		  }
		else
		{
			 content=new String(ch,start,length);
			outstr.append(content);
		}
	}
	@Override
	public void startElement(String url, String LocalName, String qName, Attributes attr) throws SAXException {
		if(this.qName.trim().equalsIgnoreCase("编码数据"))
		 {
			//清除base64文件内容
			if( this.base64File.length()>0 )
			  this.base64File.delete(0, this.base64File.length());
			this.pos=0; //换文件时复位文件指针
		  }
		log.info("开始元素:"+qName);
		outstr.append("<"+qName);
		this.qName=qName;
		for(int i=0;i<attr.getLength();i++){
			//log.info("属性"+attr.getQName(i)+"值是:"+attr.getValue(i));
			outstr.append(" ").append(attr.getQName(i)).append("=\"").append(attr.getValue(i)).append("\"");
		}
		outstr.append(">");
		base64Str = new StringBuilder();
	}
	@Override
	public void endElement(String url, String LocalName, String qName) throws SAXException {
		log.info("结束元素:"+qName);
		if(this.qName.trim().equalsIgnoreCase("编码数据"))
		{
			//将剩下base64流写入到文件中
			if(this.base64File.length()!=0)
			{
				byte[] base64byte;
				try {
					base64byte = Constant.decoderBase64(this.base64File.toString());
					downfile(base64byte,filename,pos,base64byte.length);
					//清除base64文件内容
					if( this.base64File.length()>0 )
					  this.base64File.delete(0, this.base64File.length());
				} catch (Exception e) {
					//清除base64文件内容
					if( this.base64File.length()>0 )
					  this.base64File.delete(0, this.base64File.length());
					log.error(e.getMessage());
				}
				
			}
			this.pos=0; //换文件时复位文件指针
		}
		outstr.append("</"+qName+">");
	}
	
	
	/**
     * method  分段下载文件流
     * @param  buffer 上传文件流字节流
     * @param  downpath 文件path
     * @param   filename  文件名
     * @param   long pos 写入文件开始位置
     * @param    long writeSize 一次写入文件大小
     * @return 返回无
     * @throws Exception 
     */
    private  void downfile( byte[]  buffer ,String filename,int pos,int writeSize) {
        RandomAccessFile myRAFile = null;
        File  f =null;
        try 
           {
        	  f =new File(filename);
         	  myRAFile = new RandomAccessFile(f, "rw");
        	  myRAFile.seek(pos);
        	  //log.info( "每片指针位置:"+pos );
        	  //log.info( "每片文件大小:"+writeSize );
        	  int total=pos+writeSize;
        	  log.info( "总大小:"+total );
        	  myRAFile.write(buffer,0,writeSize);
        	  f =null;
        	  buffer=null;
        	  myRAFile.close();
          	  myRAFile=null;
           }
        catch (Exception e) {
	            log.error("下载电子文件不成功");
	            try {
	            	 f =null;
	         	     buffer=null;
	         	     myRAFile.close();
	           	     myRAFile=null;
				} catch (IOException e1) {
					 f =null;
	         	     buffer=null;
	           	     myRAFile=null;
				}
          }
    }

}




package com.base64.tool;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
import org.xml.sax.SAXException;
/**
 * 大文件xml解板工具类
 * @author 珠海·李正球
 * @version 1.0 2012-07-20
 */
public class Base64read {

	public static void main(String[] args) {
		try {
				SAXParserFactory factory=SAXParserFactory.newInstance();
				factory.setNamespaceAware(true);
				factory.setValidating(true);
				SAXParser parser=factory.newSAXParser();
				Base64readutil p1=new Base64readutil("c:\\testnew.xml");
				parser.parse(new File("c:\\test.eep"), p1);

		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

分享到:
评论

相关推荐

    SAX与JAVA.rar_SAX java_java SAX_java sax download_sax_xml

    标题中的"SAX与JAVA.rar"指的是Java编程语言中用于处理XML文档的一种解析器——SAX(Simple API for XML)。SAX是一种基于事件驱动的解析模型,它以流式的方式读取XML文档,逐个处理XML元素,而不是一次性加载整个...

    base64的XML或XML生成png图片.rar

    综上所述,"base64的XML或XML生成png图片.rar"项目涉及了Java编程语言中的XML解析、Base64编码与解码、图像处理等多个技术领域。通过理解和掌握这些技术,开发者可以创建出更安全、更灵活的数据转换解决方案。

    java反射机制 字符串——java对象

    在Java中,将Java对象的数据封装成XML格式的字符串,通常涉及到对象序列化的过程。对象序列化是将对象的状态转换为字节流,以便存储或在网络上传输。这个过程可以通过实现`java.io.Serializable`接口来完成。反序列...

    Java SAX解析Xml文档Demo

    Java SAX(Simple API for XML)解析器是一种基于事件驱动的XML解析方式,它不将整个XML文档加载到内存中,而是逐行读取,当遇到某个事件(如开始标签、结束标签等)时,会触发相应的事件处理器方法。这种方式节省了...

    java sax 解析xml

    与DOM(Document Object Model)解析器不同,SAX不需要一次性加载整个XML文档到内存中,而是以事件驱动的方式逐个处理XML元素,这使得它在处理大型XML文件时表现得更加优秀。下面将详细介绍Java SAX解析XML的相关...

    java用sax实现重写xml文件内容

    Java中的SAX(Simple API for XML)是一种轻量级的解析器,用于处理XML文档。它以事件驱动的方式工作,当解析器遇到XML文档的各个部分时,会触发相应的事件,如开始文档、结束文档、开始元素、结束元素等。这种方法...

    javaSAX方式解析xml文档

    Java SAX方式解析XML文档是一种高效的处理大型XML文件的方法,它基于事件驱动模型,不将整个XML文档加载到内存中,而是逐个处理XML元素。这种方式非常适合处理大文件,因为它节省了内存,但需要编写更多的代码来处理...

    SAX.java 操作xml文件

    SAX.java 操作xml文件SAX.java 操作xml文件SAX.java 操作xml文件SAX.java 操作xml文件SAX.java 操作xml文件SAX.java 操作xml文件SAX.java 操作xml文件SAX.java 操作xml文件

    jsp操作xml源码,解析器为DOM和SAX

    在IT行业中,XML(eXtensible Markup Language)是一种用于存储和传输数据的标准化格式,因其结构清晰、可扩展性强而被广泛应用。JSP(JavaServer Pages)是Java平台上的动态网页技术,允许开发者在HTML页面中嵌入...

    sax解析xml尤其是获取元素的值或者内容

    在IT行业中,XML(eXtensible Markup Language)是一种用于存储和传输数据的标准化格式,尤其在Web服务、配置文件和数据交换等领域广泛应用。SAX(Simple API for XML)是XML解析的一种方式,它采用事件驱动模型,...

    java Sax解析Xml

    与DOM(Document Object Model)解析器不同,SAX不将整个XML文档加载到内存中,而是逐个读取XML文档的元素和属性,通过触发一系列的事件回调函数来解析数据,这种方式更节省内存,适合处理大数据量的XML文件。...

    base64的XML或XML生成pdf图片.rar

    这里我们关注的是如何使用Java语言将XML数据转换为PDF图片,并且涉及到了Base64编码。这个过程通常涉及到多个步骤,包括XML解析、数据处理、图像生成以及PDF创建。下面我们将详细讲解这些知识点。 1. **Base64编码*...

    android SAX解析String类型 XML 字符串

    "SAX解析String类型XML字符串"就是一种高效且节省内存的方式去解析XML数据,特别是当XML文件较大时,SAX解析器优于DOM解析器,因为它不需要一次性加载整个XML到内存中。下面我们将深入探讨这一主题。 首先,XML...

    JAVA SAX解析XML

    **JAVA SAX解析XML** 在Java编程中,XML(Extensible Markup Language)是一种广泛使用的数据交换格式,用于存储和传输结构化数据。为了处理XML文档,Java提供了两种主要的解析方式:DOM(Document Object Model)...

    软件自动更新_base64编解码_xml文件的生成与读取

    Base64编码把每3个字节的数据转换成4个Base64字符,确保数据在传输过程中不被破坏。在软件更新中,Base64编码可能会用来安全地在网络上传输文件或配置信息。解码则是将接收到的Base64字符串还原为原始的二进制格式,...

    Java使用SAX的rss解析实例

    本实例结合了Java、SAX解析器和Struts框架,来实现RSS feed的读取与展示。 首先,我们来详细理解Java中的SAX解析。SAX解析器并不将整个XML文档加载到内存中,而是通过触发一系列的事件(如开始元素、结束元素、字符...

    Java使用sax、dom、dom4j解析xml文档

    XML(eXtensible Markup Language)是一种用于存储和传输数据的标准格式,特别是在Java应用程序中,XML经常被用来作为数据交换的载体。Java提供了多种解析XML的API,包括SAX(Simple API for XML)、DOM(Document ...

    java解析xml数据---sax解析器

    与DOM(Document Object Model)解析器不同,SAX不需要一次性加载整个XML文档到内存,而是逐行或逐事件解析,因此它在内存占用和性能上具有优势。 SAX解析的基本工作原理是通过事件处理器(如ContentHandler、...

    Java中XML配置文件的读取(sax).doc

    Java中XML配置文件的读取(SAX) XML配置文件是Java开发中常用的配置文件格式,特别是在J2EE项目中。XML文件可以存储配置信息,并且易于维护和修改。然而,在Java中读取XML配置文件成了一个需要解决的问题。本文将...

    java中的sax解析方案

    Java中的SAX解析方案是一种高效的XML处理方法,尤其适用于大体积的XML文件。SAX(Simple API for XML)是基于事件驱动的解析器,它不会像DOM解析那样将整个XML文档加载到内存中,而是逐行读取并触发相应的事件处理器...

Global site tag (gtag.js) - Google Analytics