dom4j跟Jdom、sax、dom之间的区别网上很多,一搜一大堆,但是处理大文件的比较少。
所以总结下生成和读取大的XML文件
生成大文件
public void writeToFile(String filePath,String fileName){
Document doc = DocumentHelper.createDocument();
Element rootElement=doc.addElement("root");
rootElement.addAttribute("name", "root");
Element testElement = DocumentHelper.createElement("eleTest");
testElement.addAttribute("name", "testEle");
testElement.addText("this is another text");
testElement.setParent(rootElement);
XMLWriter out = null;
try{
out = new XMLWriter(new FileWriter(new File(filePath+File.separator+fileName)));
out.startDocument();
out.writeOpen(rootElement);
for(int i=0;i<=10000000;i++){
out.write(testElement);
}
out.writeClose(rootElement);
}catch(SAXException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
finally{
if( out!=null ){
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
插入10000000条数据,可以生成500多M的文件
然后再读取这个文件
SAXReader reader = new SAXReader();
reader.setDefaultHandler(new ElementHandler(){
public void onEnd(ElementPath ep) {
Element e = ep.getCurrent(); //获得当前节点
System.out.println(e.getName());
e.detach(); //记得从内存中移去
}
public void onStart(ElementPath arg0) {
}
});
doc = reader.read(new BufferedInputStream(new FileInputStream(new File(fileName))));
一般网上的都是用一个实现 ElementHandler的类来做,然后把reader.setDefaultHandler(this)
我这里是用一个匿名类
主要的要点就是要每读取一个节点,就需要从内存中把这个节点给移去,要不肯定会报内存不足的。