使用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();