SAXBuilder()。build(InputStream) - 这会将整个文件读入内存吗?

时间:2018-06-04 19:13:55

标签: java xml sax jdom

阅读文档,这是我见过的所有示例中使用的方法:

org.jdom.input.SAXBuilder的版本为jdom-1.1.jar

Document doc = new SAXBuilder().build(is);
Element root = doc.getRootElement();
Element child = root.getChild("someChildElement");
...

其中isInputStream变量。

我想知道,因为这是一个SAX构建器(而不是DOM构建器),是否使用构建方法将整个输入流读入文档对象?或者它是否正在处理延迟加载,并且只要我请求具有Element.getChildren()或类似功能的元素(源自根节点)只能通过文档转发,那么构建器会自动处理加载的块。我的流?

我需要确保我没有将整个文件加载到内存中。

谢谢, 麦克

2 个答案:

答案 0 :(得分:2)

类似于JDom解析器的DOM解析器将整个XML资源加载到内存中,为您提供允许在XML元素中导航的Document实例。
一些参考文献here

  

DOM标准是内存文档的编码标准   模型。

here

  

JDOM适用于逻辑内存中的XML树

DOM和JDom都在内部使用SAX解析器来读取XML资源,但它们仅使用它来将整个内容存储在它们返回的Document实例中。实际上,使用Dom和JDom,客户端永远不需要提供处理程序来拦截由SAX解析器触发的事件。

请注意,DOM和JDom都没有义务在内部使用SAX 他们主要使用它们,因为SAX标准已经存在,因此使用它来报告错误是有意义的。

  

我需要确保我没有将整个文件加载到内存中。

您有两种编程模型可以使用XML:流媒体和文档对象模型(DOM) 你正在寻找第一个。

因此,通过提供处理程序来处理由SAX解析器生成的事件(startDocument()startElement()等等),或者作为替代查看更加用户友好的API,使用SAX parserSTAX(XML的流式API):

  

作为JAXP系列中的API,可以比较StAX以及其他API,   到SAX,TrAX和JDOM。 在后两者中,StAX没有那么强大或者   灵活的TrAX或JDOM,但它也不需要那么多的内存   或处理器负载是有用的,在许多情况下,StAX可以   优于基于DOM的API 。上面提到的相同论点,   权衡DOM模型与流媒体的成本/收益   模特,在这里申请。

答案 1 :(得分:1)

它急切地解析整个文件以构建XML文件的内存表示(即Document)。

如果您想完全确定,可以查看GitHub上的来源。更重要的是以下课程:SAXBuilderSAXHandlerDocument

相关问题