【发布时间】:2021-12-17 00:08:27
【问题描述】:
我想更改我在 Java 中的一个函数来处理大文件。我已经阅读了有关SAX、StAX 的信息,但我无法理解它们是如何工作的以及哪种解决方案是最好的。
我目前使用的功能是以下一个:
public static String nodeToString(Node node) throws TransformerFactoryConfigurationError, TransformerException {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
Source source = new DOMSource(node);
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
transformer.transform(source, result);
return sw.toString();
}
编辑:输入参数不能更改(Node node),返回参数必须是字符串。
我想要一个功能相同但使用 SAX、Stax... 的函数来处理大文件。
编辑2:
我在函数中收到的“节点”(org.w3c.dom.Node)的结构是:
<test>
<test1>
<test2>JVBERi0xLjQKJcOk (This is a base 64 file. The size of this file can be 5MB, 20MB, 400MB. The maximum size is 400MB</test2>
<test3>PDF</test3>
</test1>
<test4>
<test5>Test description</test5>
</test4>
如您所见,“test2”节点保存一个 Base 64 格式的文件。该节点可以保存一个 5MB、20MB、100MB、... 最多 400MB 的文件。
抛出的OOM异常是下面这行:
transformer.transform(source, result);
【问题讨论】:
-
您好。请考虑添加确切的问题。您想在这里实现什么目标?
-
刚刚编辑了添加我想要实现的问题的问题。谢谢谢尔盖。
-
您是在询问解析 XML 还是写出 XML?如果您正在解析 XML,SAX API 很有用 - 但是您已经在内存中获得了
Node node并且您的代码正在转换回 XML。使用 FileWriter 代替 StringWriter 以避免将 XML 的内存占用添加到您的进程中。 -
@DuncG 我必须做函数的工作。它需要一个节点并返回一个字符串。 OOM 发生在“transformer.transorm(source, result)”中。如果我使用 FileWriter,我是否必须将文件保存在磁盘上然后读取它?非常感谢
-
问题中没有提到OOM!添加有关失败的 XML 大小的详细信息,并尝试预先调整
StringWriter(estimatedSize)的大小。你应该让接收者从一个流而不是字符串中读取。