代码之家  ›  专栏  ›  技术社区  ›  Mike

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

  •  2
  • Mike  · 技术社区  · 7 年前

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

    (版本) 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构建器相反),那么整个inputstream是否会通过构建方法读入document对象?或者它是在惰性负载下工作的,只要我用 Element.getChildren() 或者类似的函数(源于根节点)只通过文档转发,那么构建器会自动为我加载流的块吗?

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

    谢谢 迈克

    2 回复  |  直到 7 年前
        1
  •  2
  •   davidxxx    7 年前

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

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

    here :

    JDOM处理内存中的逻辑XML树,

    DOM和JDom都在内部使用SAX解析器来读取XML资源,但它们只使用SAX解析器将整个内容存储在 文件 他们返回的实例。实际上,对于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。 在后两者中,斯塔克斯没有那么强大或强大 与TrAX或JDOM一样灵活,但也不需要那么多内存 或者处理器负载是有用的,在许多情况下,StAX可以, 优于基于DOM的API s、 与上述观点相同, 权衡DOM模型与流媒体模型的成本/收益 模特,在这里申请。

        2
  •  1
  •   Bhesh Gurung AlexR    7 年前

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

    如果你想绝对肯定这一点,你可以在 GitHub .更重要的是,以下课程: SAXBuilder , SAXHandler Document .