2011-03-28 91 views
3

检查文件是否包含特定字符串或数字的最快方法是什么?使用java在文本文件中查找字符串的最快方法

+5

谷歌首次^ _ ^总是帮助:-D – Neal 2011-03-28 14:47:57

+0

检查此链接:http: //www.dreamincode.net/forums/topic/48905-search-inside-a-text-file/ – reggie 2011-03-28 14:48:19

+3

我知道如何使用谷歌... 我想知道哪种方法更快...例如使用扫描仪或缓冲读取器... – Franky 2011-03-28 15:02:02

回答

5

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

2

未尝试过,但可能最快的机制是首先将您的搜索关键字编码为文件。例如,如果您知道该文件是UTF-8,请取出您的密钥并将其从一个字符串(UTF-16)编码为UTF-8字节数组。这很重要,因为通过编码到文件表示,您只能对密钥进行编码。使用标准的Java阅读器则是另一种方式 - 将文件转换为UTF-16。

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

最后,执行字符串搜索一个Boyer-Moore algorithm,使用针对通过映射区域的文件的字节的关键字节,

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

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(); 
相关问题