2

我有一些数据(大约 150-200 MB)需要转换成 XML 文件。我之前尝试过基于 DOM 来做,但是内存是一个很大的限制。

我开始查看 StaX 实现并有一些疑问。

可以说我有以下代码。

  XMLStreamWriter writer = factory.createXMLStreamWriter(new FileWriter("output.xml"));
  writer.writeStartDocument("  ");
  writer.writeStartElement(" ");
  writer.writeStartElement("");
  // call method X a million times
  writer.writeEndElement(" ");
  writer.flush();
  writer.close();

  // method x
  X() {
     writer.writeStartElement("  ");
     writer.writeEndElement();
  }
  1. 我假设每当执行方法 X 时,它都会将元素写入文件。直到现在,这不会将转换后的 XML 保存在内存中。我对吗?

  2. 这会像前 2 个开始元素一样自动关闭未关闭的标签吗?

  3. 我可以刷新编写器并再次使用相同的编写器将更多的 xml 附加到文件中,如下所示:

    X() 
    {
        writer.writeStartElement("  ");
        writer.writeEndElement();
        writer.flush();
    }
    
4

2 回答 2

2

我假设每当执行方法 X 时,它都会将元素写入文件。直到现在,这不会将转换后的 XML 保存在内存中。我对吗?

StAX 解析器可以在将 XML 的子集写入文件之前将其缓冲在内存中,以减少为提高性能而完成的磁盘 I/O 量。它不会缓存太多以至于您的内存不足。

这会像前 2 个开始元素一样自动关闭未关闭的标签吗?

writeEndDocument方法将自动关闭任何未关闭的标签。

我可以刷新编写器并再次使用相同的编写器将更多的 xml 附加到文件中,如下所示:

XMLStreamWriter调用writeEndDocument. flush在编写更多内容之前,您无需显式调用。一旦你完成了,XMLStreamWriter你应该调用close它来释放它。

于 2013-06-14T13:11:32.570 回答
1
  1. 是的,但是您应该在缓冲区中缓冲一些(小)写入。除了 FileWriter 之外,您还应该使用 BufferedWriter。否则,它会进行太多的系统调用。

  2. 一旦您调用 writeEndElement(),它就会写入结束标签。

  3. 是的,这应该是要走的路。

于 2013-06-14T12:52:47.607 回答