使用java在文本文件中查找字符串的最快方法
检查文件是否包含某个字符串或数字的最快方法是什么?
查看随JDK一起提供的Scanner
类( 参见官方文档 )。 您将能够跳过输入的某些部分(在本例中为文本文件)并匹配您的愿望的正则表达式。 我不确定这是否是最有效的方式,但果然 – 这很简单。 您也可以看一下这个例子 ,它将帮助您入门。
未经validation,但可能最快的机制是首先,使用您的搜索键并将其编码为文件。
例如,如果您知道该文件是UTF-8,请将您的密钥从String(UTF-16)编码为UTF-8字节数组。 这很重要,因为通过向下编码到文件表示,您只需对密钥进行编码。 使用标准Java Readers则是另一种方式 – 将文件转换为UTF-16。
现在您有一个正确的密钥(以字节为单位),使用NIO为该文件创建MappedByteBuffer 。 这会将文件映射到虚拟内存空间。
最后,实现一个用于字符串搜索的Boyer-Moore算法 ,通过映射区域使用密钥字节对文件的字节,
可能有更快的方法,但这解决了在Java中搜索文本文件的大部分问题。 它利用VM来避免复制文件的大块,并且它会跳过文件所在的任何编码的转换步骤到Java内部使用的UTF-16。
查看以下算法:
- 博耶-穆尔
- 克努特莫里斯普拉特
或者如果你想找到一组字符串中的一个:
- 拉宾,卡普
我在MIMEParser中找到的最佳实现: https : //github.com/samskivert/ikvm-openjdk/blob/master/build/linux-amd64/impsrc/com/sun/xml/internal/org/jvnet/mimepull/ MIMEParser.java
/** * Finds the boundary in the given buffer using Boyer-Moore algo. * Copied from java.util.regex.Pattern.java * * @param mybuf boundary to be searched in this mybuf * @param off start index in mybuf * @param len number of bytes in mybuf * * @return -1 if there is no match or index where the match starts */ private int match(byte[] mybuf, int off, int len) {
还需要:
private void compileBoundaryPattern();