2010-01-26 175 views
21

是否有任何方法從文本文件中讀取特定的行?在API或Apache Commons中。 喜歡的東西:從Java中的文本文件中讀取特定的行

String readLine(File file, int lineNumber) 

我同意這是微不足道的實施,但它不是非常有效的特別是如果該文件是非常大的。

回答

17
String line = FileUtils.readLines(file).get(lineNumber); 

會做,但它仍然有效率問題。

或者,你可以使用:

LineIterator it = IOUtils.lineIterator(
     new BufferedReader(new FileReader("file.txt"))); 
for (int lineNumber = 0; it.hasNext(); lineNumber++) { 
    String line = (String) it.next(); 
    if (lineNumber == expectedLineNumber) { 
     return line; 
    } 
} 

這將是稍微更有效,因爲緩衝區。

看看Scanner.skip(..)並嘗試跳過整行(用正則表達式)。我不知道它是否會更有效率 - 以此爲基準。

P.S.與效率我的意思是內存效率

+0

什麼是FileUtils?它來自Java 7嗎? – finnw 2010-01-26 09:21:59

+0

不,它是commons-io - 問題中指定的庫 – Bozho 2010-01-26 09:28:43

+1

效率?我認爲真正的問題是,第一個解決方案將**整個**文件讀到內存中...... – abyx 2010-01-26 09:41:17

1

如果你讀的系是所有相同的長度,然後計算可能是有用的。

但是在線條長度不同的情況下,我不認爲有一種方法可以逐個讀取它們,直到行數正確爲止。

+0

和「相同長度」是指字節長度相同,而不是字符(考慮到可變長度字符編碼) – MBO 2010-01-26 09:21:11

+0

實際上輸入文件是固定長度和ANSI,我忘了在問題中指定這個。問題可能是行分隔符,應用程序必須在Windows和Unix中運行。 – 2010-01-26 10:18:27

0

如果您要以相同的方式使用同一個文件(在特定行查找文本),您可以爲您的文件建立索引。行號 - >偏移量。

5

不是我所知道的。

要知道,有上的文件沒有特殊的索引,以線開始的地方,所以任何實用的方法是完全一樣有效,因爲:

BufferedReader r = new BufferedReader(new FileReader(file)); 
for (int i = 0; i < lineNumber - 1; i++) 
{ 
    r.readLine(); 
} 
return r.readLine(); 

(用適當的錯誤處理和資源關閉邏輯,當然)。

1

不幸的是,除非你能保證文件中每一行的長度完全相同,否則你將不得不通讀整個文件,或者至少讀到你之後的行。

你可以計算行的唯一方法是在文件中尋找新的行字符,這意味着你將不得不讀取每個字節。

可以優化你的代碼,使它整潔可讀,但是在你的下面你總是會閱讀整個文件。

如果您要反覆讀取同一文件,您可以解析該文件並創建一個存儲某些行號的偏移量的索引,例如第100,200行等的字節數爲。

1

由於文件是字節而不是行定向 - 任何通用解決方案的複雜度最多爲O(n),其中n爲文件大小(以字節爲單位)。您必須掃描整個文件並計算行分隔符,直到您知道要讀取的文件的哪一部分。

1

guava有類似的東西:

List<String> Files.readLines(File file, Charset charset); 

所以,你可以做

String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber); 
1

使用文件utils的:

File fileFeatures = new File(
       "Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt"); 
String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber); 
0

根據這一answer,爪哇8使我們能夠提取特定來自文件的行。答案中提供了示例。