避免在内存中使用大对象,或使用String来保存应使用更好的工具处理的大型文档.例如,不要将大型XML文档读入String或DOM.
以上引用来自一篇文章.读取大型xml文档的最佳解决方案是什么?
使用SAX或StAX解析器,它不会在内存中保存xml的所有内容.
与DOM解析器不同,SAX解析器不会创建XML文档的内存中表示,因此更快并且使用更少的内存.相反,SAX解析器通过调用回调来通知客户端XML文档结构,即通过调用提供给解析器的org.xml.sax.helpes.DefaultHandler实例上的方法.
这是一个示例实现:
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
DefaultHandler handler = new MyHandler();
parser.parse("file.xml", handler);
Run Code Online (Sandbox Code Playgroud)
在哪里
MyHandler的
定义生成文档/元素的开始/结束等事件时要采取的操作.(下面只是基本实现)
class MyHandler extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
}
@Override
public void endDocument() throws SAXException {
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
}
// To take specific actions for each chunk of character data (such as
// adding the data to a node or buffer, or printing it to a file).
@Override
public void characters(char ch[], int start, int length)
throws SAXException {
}
}
Run Code Online (Sandbox Code Playgroud)
这是SAX和StAX解析器样本的好文章