流上字节的 Java 正则表达式替代方案

标签 java xml regex stream

我的 XML 文件(以 UTF-8 编码)有两个问题:

  • 其中一些(不是全部)包含 Byte order mark EF BB BF

  • 其中一些(不是全部)包含 Null 字符 00,分布在整个文件中。

这两个问题都阻止我使用 SAX 解析器解析 XML。我目前的方法是将文件读入字符串并使用正则表达式来提取这些字符并将字符串写回文件,这工作正常。 但是,我的文件非常大(数百兆字节),每次我调用 replaceAll() 时,将文件读入字符串并创建相同大小的结果字符串,很快就会导致 Java 堆空间错误。

增加堆大小绝对不是长久之计。我需要流式传输文件并即时提取所有这些字符。

关于高效解决方案应该是什么样子的任何建议?

最佳答案

我会将 FilterInputStream 子类化以在运行时过滤掉不需要的字节。

这个任务应该相当简单,因为字节顺序标记可能只在文件的开头(所以你只需要在那里检查)并且可以使用简单的 == 轻松过滤空字节> 比较(不需要类似正则表达式的功能)。

这很可能还会提高性能,因为您不需要在重新读取之前将完整的更正文件写入磁盘。

关于流上字节的 Java 正则表达式替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5881544/

相关文章:

java - 为什么我们需要 Java 中的接口(interface)?

python - 如何通过搜索元素的属性在 Python 中使用 ElementTree 删除 xml 中的节点?

java - 正则表达式查找字符串并根据条件替换它或添加额外字符

html - 将制表符分隔的文本文件转换为 HTML/PDF/latex/knitr 报告

regex - 排除子目录

java - 使用 "in"修饰符编写 MongoDB 查询

javascript - 将 Java 数组从 Spring MVC Controller 传递到 JSP 脚本 var 变量抛出错误

android - 如何只显示按钮

java - 如何在 Delphi 对象或字符串中隐式使用 ToString()?

python - 在python中加入xml element.text