我有一些数据(大约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();
}
我假设每当执行方法X时,它会将元素写入文件。这不会将转换后的XML保留到内存中。我是对的吗?
这会像前两个开始元素一样自动关闭未关闭的标签吗?
我可以刷新编写器并再次使用同一个编写器将更多xml附加到文件中,如下所示:
X()
{
writer.writeStartElement(" ");
writer.writeEndElement();
writer.flush();
}
答案 0 :(得分:2)
我假设每当执行方法X时,它都会写入 元素进入文件。直到现在,这不会保留转换后的XML 记忆。我是对的吗?
StAX解析器可以在将XML写入文件之前在内存中缓冲XML的子集,以减少为提高性能而执行的磁盘I / O量。它不会缓存太多以至于内存不足。
这会自动关闭未关闭的标签,就像前两个开始一样 元素?
writeEndDocument
方法会自动关闭所有未关闭的代码。
我可以刷新编写器并再次使用同一个编写器来附加一些编写器 更多xml到这个文件:
您可以继续使用相同的XMLStreamWriter
将内容写入XML文件,直到您致电writeEndDocument
。在编写更多内容之前,您无需显式调用flush
。完成XMLStreamWriter
后,您应该在其上调用close
以将其释放。
答案 1 :(得分:1)
是的,但你应该在缓冲区中缓冲一些(小)写入。除了FileWriter之外,您还应该使用BufferedWriter。否则,它会进行太多的系统调用。
一旦调用writeEndElement(),它就会写入结束标记。
是的,这应该是要走的路。