在 Java 中读取 BIG XML 文件的一小部分的有效方法

Posted

技术标签:

【中文标题】在 Java 中读取 BIG XML 文件的一小部分的有效方法【英文标题】:Efficient way to read a small part of a BIG XML file in Java 【发布时间】:2012-08-20 08:51:58 【问题描述】:

我们有一个新要求:

有一些 BIG xml 文件不断进入我们的系统,我们需要立即使用 Java 快速处理它们。该文件很大,但我们处理所需的信息在一个非常小的元素内。 ... ...

在我们开始处理之前,从大文件中提取这小部分数据的最佳方法是什么?如果我们尝试加载整个文件,由于大小,我们将立即出现内存不足错误。 Java 中的有效方法是什么,我可以使用它来获取 ..data..data..data.. 数据元素,而无需逐行加载或读取文件。是否有任何 SAX 解析器可以用来完成这项工作?

谢谢

【问题讨论】:

【参考方案1】:

SAX 解析器是基于事件的,并且速度更快,因为它们可以满足您的需求:它们不会完全读取 xml 文档。 Java 发行版中有一个SAXParser

【讨论】:

找到感兴趣的部分后,您推荐的停止解析的方法是什么?恕我直言,SAX 使用的回调模型并不适合。 我必须同意这一点。仔细定义处理程序方法(高效且最少的代码)也很重要,否则您最终可能会构建一个不比基于 DOM 的解决方案好多少。 我认为 XMLStreamReader (StAX) 可能更适合这里。由于它为您提供了一个迭代器,因此您可以循环直到找到您要查找的内容,阅读它,然后关闭阅读器。【参考方案2】:

我不得不在以前的项目 (1G-2G) 中解析大文件,并且不想使用 SAX。我发现 SAX 在某些情况下太低级,并且在大多数情况下喜欢保持遍历方法。

我使用了 VTD 库 http://vtd-xml.sourceforge.net/。这是一个非常快速的库,使用指针在文档中导航。

【讨论】:

【参考方案3】:

好吧,如果您想读取文件的一部分,您需要读取文件的每一行,以便能够识别感兴趣的文件部分,然后提取您感兴趣的部分需要。

如果您只需要传入 XML 的一小部分,您可以使用 SAX,或者如果您只需要读取特定的元素或属性,您可以使用 XPath,这将更容易实现。

Java 带有一个内置的 SAXParser 实现以及一个 XPath 实现。查找 SAXParser here 和 XPath here 的 javadocs。

【讨论】:

XPath 在向下钻取路径时会将内容保留在内存中吗? @MiserableVariable Java 的内置 XPath 实现接受 DOM 元素(如 Document、Node 等)以及 InputSource 对象(由 SAX 支持)。所以这取决于你如何使用它。 @Alex 考虑到自 Java 5 以来任何链接类都没有变化,链接的文档版本是否重要?【参考方案4】:

StAX 是另一种基于流数据的选项,如 SAX,但受益于更友好的方法 (IMO) 通过“拉”您想要的而不是“推”给您来处理数据。

【讨论】:

以上是关于在 Java 中读取 BIG XML 文件的一小部分的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

java中有没有 读取大文本文件(500MB以上),指定行数的某一行数据的类库? 有的话请给出教程,谢谢~

如何读取xml文件导出为excel文件

java从xml读取数据更快还是从数据库里读取数据更快?

java怎样读取解析xml文件中的数据转换成java对象

Java中XML文件的读取与写入

java读取xml文件内容