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

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

5
请先使用谷歌搜索,这通常会有所帮助 :-D。 - Naftali
请查看此链接:http://www.dreamincode.net/forums/topic/48905-search-inside-a-text-file/ - reggie
3
我知道如何使用谷歌... 我想知道哪种方法更快...例如使用Scanner还是BufferedReader... - Fseee
5
@Neal 这是现在谷歌搜索结果的第一个。 - Ren
4个回答

5

请看随JDK一起提供的Scanner类(请参阅官方文档)。您将能够跳过输入(在这种情况下是文本文件)的某些部分,并与您想要的正则表达式匹配。我不确定这是否是最有效的方法,但肯定足够简单。您还可以查看此示例,这将帮助您入门。


2

未经试验,但可能是最快的机制是首先将搜索关键字编码为像文件一样的格式。

例如,如果您知道文件是UTF-8,则需要将关键字从String(它是UTF-16)编码为UTF-8字节数组。这很重要,因为通过向下编码到文件表示,您只编码了关键字。使用标准的Java Readers则相反——将文件转换为UTF-16。

现在,您拥有了一个适当的、以字节为单位的关键字,请使用NIO为文件创建MappedByteBuffer。这将文件映射到虚拟内存空间中。

最后,使用Boyer-Moore算法进行字符串搜索,使用关键字的字节与通过映射区域的文件的字节进行匹配。

可能有更快的方法,但是这种方法解决了在Java中搜索文本文件的大部分问题。它利用虚拟机来避免复制大块的文件,并跳过了将文件转换为UTF-16的转换步骤,而Java在内部使用UTF-16。


0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接