我正在读取一个我无法一次缓冲所有文件的文件,因为它的大小范围从 256MB 到 ~2GB 不等。
打开文件后,我将其中的一部分读入字节数组,比如 512 字节,将其转换为字符串并在其上运行正则表达式,如果检测到模式,我的程序会记录下来.
我遇到的问题是我的程序丢失了文件中应该检测模式的很多位置。
我 90% 确定问题是虽然模式存在,但它不完整,因为它超出了缓冲区的长度。我正在寻找的模式长度为八个字节,因此,例如,模式的前四个字节位于数组的最后四个位置;所以当它再次被填充时,数组的前四个字节就是模式的后四个字节。因此,我的正则表达式总是失败。
我猜我需要做的是填充缓冲区,然后当它再次填充时,保留最后 20 个左右的字节,这样它就不会错过我正在寻找的任何模式.
如有任何建议,我们将不胜感激。提前致谢。
托尼
最佳答案
首先,您不能将 Java 正则表达式应用于字节数组。您必须将它应用于 String
。因此,您必须将 byte[]
转换为 String
,并且您可能 (a) 使用了错误的编码,或者 (b) 截断了中间的字符串。
一旦你克服了这个问题,你就需要使用流媒体规则来重构你阅读的内容。我可以描述一个可能适用或可能不适用的:
- 将一大块数据读入缓冲区。
- 在缓冲区中找到最后一句话的边界。
- 从开始到边界的过程。
- 将余数移到缓冲区的前面。
- 从源重新填充缓冲区的其余部分。
- 起泡、冲洗、重复。
如果这真的是一个普通的字 rune 件,那么修改如下:
Reader r = new InputStreamReader(inputByteStream, Charset.forName("utf-8"));
然后应用上面的算法来避免缓冲区边界条件。
关于java - 将正则表达式应用于从缓冲大文件的小字节数组缓冲区创建的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7340482/