把电子文件流转成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"指的是Java编程语言中用于处理XML文档的一种解析器——SAX(Simple API for XML)。SAX是一种基于事件驱动的解析模型,它以流式的方式读取XML文档,逐个处理XML元素,而不是一次性加载整个...
综上所述,"base64的XML或XML生成png图片.rar"项目涉及了Java编程语言中的XML解析、Base64编码与解码、图像处理等多个技术领域。通过理解和掌握这些技术,开发者可以创建出更安全、更灵活的数据转换解决方案。
在Java中,将Java对象的数据封装成XML格式的字符串,通常涉及到对象序列化的过程。对象序列化是将对象的状态转换为字节流,以便存储或在网络上传输。这个过程可以通过实现`java.io.Serializable`接口来完成。反序列...
Java SAX(Simple API for XML)解析器是一种基于事件驱动的XML解析方式,它不将整个XML文档加载到内存中,而是逐行读取,当遇到某个事件(如开始标签、结束标签等)时,会触发相应的事件处理器方法。这种方式节省了...
与DOM(Document Object Model)解析器不同,SAX不需要一次性加载整个XML文档到内存中,而是以事件驱动的方式逐个处理XML元素,这使得它在处理大型XML文件时表现得更加优秀。下面将详细介绍Java SAX解析XML的相关...
Java中的SAX(Simple API for XML)是一种轻量级的解析器,用于处理XML文档。它以事件驱动的方式工作,当解析器遇到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文件
在IT行业中,XML(eXtensible Markup Language)是一种用于存储和传输数据的标准化格式,因其结构清晰、可扩展性强而被广泛应用。JSP(JavaServer Pages)是Java平台上的动态网页技术,允许开发者在HTML页面中嵌入...
在IT行业中,XML(eXtensible Markup Language)是一种用于存储和传输数据的标准化格式,尤其在Web服务、配置文件和数据交换等领域广泛应用。SAX(Simple API for XML)是XML解析的一种方式,它采用事件驱动模型,...
与DOM(Document Object Model)解析器不同,SAX不将整个XML文档加载到内存中,而是逐个读取XML文档的元素和属性,通过触发一系列的事件回调函数来解析数据,这种方式更节省内存,适合处理大数据量的XML文件。...
这里我们关注的是如何使用Java语言将XML数据转换为PDF图片,并且涉及到了Base64编码。这个过程通常涉及到多个步骤,包括XML解析、数据处理、图像生成以及PDF创建。下面我们将详细讲解这些知识点。 1. **Base64编码*...
"SAX解析String类型XML字符串"就是一种高效且节省内存的方式去解析XML数据,特别是当XML文件较大时,SAX解析器优于DOM解析器,因为它不需要一次性加载整个XML到内存中。下面我们将深入探讨这一主题。 首先,XML...
**JAVA SAX解析XML** 在Java编程中,XML(Extensible Markup Language)是一种广泛使用的数据交换格式,用于存储和传输结构化数据。为了处理XML文档,Java提供了两种主要的解析方式:DOM(Document Object Model)...
Base64编码把每3个字节的数据转换成4个Base64字符,确保数据在传输过程中不被破坏。在软件更新中,Base64编码可能会用来安全地在网络上传输文件或配置信息。解码则是将接收到的Base64字符串还原为原始的二进制格式,...
本实例结合了Java、SAX解析器和Struts框架,来实现RSS feed的读取与展示。 首先,我们来详细理解Java中的SAX解析。SAX解析器并不将整个XML文档加载到内存中,而是通过触发一系列的事件(如开始元素、结束元素、字符...
XML(eXtensible Markup Language)是一种用于存储和传输数据的标准格式,特别是在Java应用程序中,XML经常被用来作为数据交换的载体。Java提供了多种解析XML的API,包括SAX(Simple API for XML)、DOM(Document ...
与DOM(Document Object Model)解析器不同,SAX不需要一次性加载整个XML文档到内存,而是逐行或逐事件解析,因此它在内存占用和性能上具有优势。 SAX解析的基本工作原理是通过事件处理器(如ContentHandler、...
Java中XML配置文件的读取(SAX) XML配置文件是Java开发中常用的配置文件格式,特别是在J2EE项目中。XML文件可以存储配置信息,并且易于维护和修改。然而,在Java中读取XML配置文件成了一个需要解决的问题。本文将...
Java中的SAX解析方案是一种高效的XML处理方法,尤其适用于大体积的XML文件。SAX(Simple API for XML)是基于事件驱动的解析器,它不会像DOM解析那样将整个XML文档加载到内存中,而是逐行读取并触发相应的事件处理器...