Dom4j按流的方式读取超大文件

本文介绍如何使用Dom4j结合SAX方式解析大型XML文件,并通过元素处理机制实现低内存消耗。适用于只需处理XML文件部分内容的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文使用Dom4J读取超大XML文件,并保持很小的内存占用量。适用于不需要将XML全部内容驻留在内存,处理一部分就扔掉一部分的情况。



public class Dom4jSaxReaderSimpleExample implements ElementHandler {

public void start(File file) throws DocumentException {
SAXReader reader = new SAXReader();
reader.addHandler("/root/item", this);
reader.setDefaultHandler(new PruningElementHandler());
reader.read(file);
}

@Override
public void onStart(ElementPath elementPath) {
elementPath.getCurrent().detach();
}

@Override
public void onEnd(ElementPath elementPath) {
Element elm = elementPath.getCurrent();

// TODO process with elm

elm.detach();
elm = null;
}

public static void main(String[] args) throws DocumentException {
new Dom4jSaxReaderSimpleExample().start(new File("big.xml"));
}

}

class PruningElementHandler implements ElementHandler {
public final void onStart(ElementPath elementPath) {
elementPath.getCurrent().detach();
}

public void onEnd(ElementPath elementPath) {
Element elem = elementPath.getCurrent();
elem.detach();
elem = null;
}
}



需要注意的是应该在onStart方法里面将Element detach掉,还有就是除了注册需要的ElementHandler之外,还应该注册DefaultHandler,如例子中那样。

这是因为虽然已经用了SAX按流的方式读取XML文件,DOM4J还是会在内存创建XML的DOM结构,这会导致内存溢出,这时只要将Element对象Detach掉,在onEnd处理该Element之后,垃圾回收会将Detach的节点回收,这样就可以小内存占用处理大XML文件。

----
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值