【问题标题】:SAXBuilder().build(InputStream) - does this read entire file into memory?SAXBuilder().build(InputStream) - 这会将整个文件读入内存吗?
【发布时间】:2018-06-04 19:13:55
【问题描述】:

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

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 构建器相对),整个输入流是否会通过 build 方法读入文档对象?或者它是否可以解决延迟加载,只要我请求具有 Element.getChildren() 或类似功能(源自根节点)的元素,这些功能只能通过文档转发,那么构建器会自动处理加载流的块给我?

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

谢谢, 迈克

【问题讨论】:

  • 如果您可以通过从根目录挖掘来访问元素,则很有可能整个文档都加载到了内存中。如果你想有更多的精度,请指定SAXBuilder的包
  • 感谢大卫,我编辑了问题以反映 org.jdom.input.SAXBuilder 的版本是 jdom-1.1.jar

标签: java xml sax jdom


【解决方案1】:

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

DOM 标准是内存中文档的编纂标准 型号。

还有here

JDOM 作用于内存中的逻辑 XML 树,

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

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


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

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

所以使用SAX parser,通过提供您的处理程序来处理由 SAX 解析器(startDocument()startElement() 等)生成的事件,或者查看更用户友好的 API:STAX(流XML 的 API):

作为 JAXP 系列中的一个 API,StAX 可以与其他 API 进行比较, 到 SAX、TrAX 和 JDOM。 在后两者中,StAX 没有那么强大或 像 TrAX 或 JDOM 一样灵活,但它也不需要那么多内存 或处理器负载是有用的,StAX 在很多情况下可以, 优于基于 DOM 的 API。上述相同的论点, 权衡 DOM 模型与流式传输的成本/收益 型号,在这里申请。

【讨论】:

    【解决方案2】:

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

    如果您想完全确定这一点,您可以通过GitHub 上的源代码查看。更重要的是以下类:SAXBuilderSAXHandlerDocument

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 2021-05-18
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      相关资源
      最近更新 更多