使用java在文本文件中查找字符串的最快方法

时间:2011-03-28 14:44:37

标签: java text find pattern-matching

检查文件是否包含某个字符串或数字的最快方法是什么?

4 个答案:

答案 0 :(得分:5)

查看JDK附带的Scanner类(See official documentation)。您将能够跳过输入的某些部分(在本例中为文本文件)并匹配您的愿望的正则表达式。我不确定这是否是最有效的方式,但果然 - 这很简单。您也可以查看this example,这将有助于您入门。

答案 1 :(得分:2)

未尝试,但可能最快的机制是首先,使用您的搜索键并将其编码为文件。

例如,如果您知道该文件是UTF-8,请将您的密钥从String(UTF-16)编码为UTF-8的字节数组。这很重要,因为通过向下编码到文件表示,您只需对密钥进行编码。另一种方法是使用标准Java Readers - 将文件转换为UTF-16。

现在您有一个正确的密钥(以字节为单位),使用NIO为该文件创建MappedByteBuffer。这会将文件映射到虚拟内存空间。

最后,为字符串搜索实现Boyer-Moore algorithm,使用键的字节对照文件的字节,通过映射区域,

可能有更快的方法,但这解决了在Java中搜索文本文件的大部分问题。它利用VM来避免复制文件的大块,并且它会跳过文件所在的任何编码的转换步骤到Java内部使用的UTF-16。

答案 2 :(得分:0)

查看以下算法:

或者如果你想找到一组字符串中的一个:

答案 3 :(得分:0)

我在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();