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

SAXBuilder().build(InputStream) - does this read entire file into memory?

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

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

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

其中 is 是一个 InputStream 变量。

我想知道,由于这是一个 SAX 构建器(与 DOM 构建器相对),是否使用构建方法将整个输入流读入文档对象?或者它是否在延迟加载,只要我请求具有 Element.getChildren() 或类似功能(源于根节点)的元素,这些元素只能通过文档向前,那么构建器会自动负责加载块我的流?

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

谢谢, 麦克

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

如果您想绝对确定这一点,可以在 GitHub. More importantly the following classes: SAXBuilder, SAXHandler, and Document 上查看源代码。

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

the DOM standard is a codified standard for an in-memory document model.

here

JDOM works on the logical in-memory XML tree,

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

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


I need to be sure I'm not loading the whole file into memory.

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

所以使用 SAX parser by providing your handler to handle events generated by the SAX parser (startDocument(), startElement(), and so for) or as alternative look at a more user friendly API : STAX(流媒体 API for XML):

As an API in the JAXP family, StAX can be compared, among other APIs, to SAX, TrAX, and JDOM. Of the latter two, StAX is not as powerful or flexible as TrAX or JDOM, but neither does it require as much memory or processor load to be useful, and StAX can, in many cases, outperform the DOM-based APIs. The same arguments outlined above, weighing the cost/benefits of the DOM model versus the streaming model, apply here.