我的 XML 文件(以 UTF-8 编码)有两个问题:
其中一些(不是全部)包含 Byte order mark EF BB BF
其中一些(不是全部)包含 Null 字符 00,分布在整个文件中。
这两个问题都阻止我使用 SAX 解析器解析 XML。我目前的方法是将文件读入字符串并使用正则表达式来提取这些字符并将字符串写回文件,这工作正常。 但是,我的文件非常大(数百兆字节),每次我调用 replaceAll() 时,将文件读入字符串并创建相同大小的结果字符串,很快就会导致 Java 堆空间错误。
增加堆大小绝对不是长久之计。我需要流式传输文件并即时提取所有这些字符。
关于高效解决方案应该是什么样子的任何建议?
最佳答案
我会将 FilterInputStream
子类化以在运行时过滤掉不需要的字节。
这个任务应该相当简单,因为字节顺序标记可能只在文件的开头(所以你只需要在那里检查)并且可以使用简单的 ==
轻松过滤空字节> 比较(不需要类似正则表达式的功能)。
这很可能还会提高性能,因为您不需要在重新读取之前将完整的更正文件写入磁盘。
关于流上字节的 Java 正则表达式替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5881544/