2011-03-28 64 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(); 
相關問題