2010-04-26 79 views
2

我有一個文本文件。我想從一行到另一行檢索內容。 例如,該文件可能是200K行。我想讀第78行到第2735行的內容。由於文件可能非常大,我不想將整個內容讀入內存。用Java讀取文本文件

回答

0

這裏是一個可能的解決方案的開始:

public static List<String> linesFromTo(int from, int to, String fileName) 
     throws FileNotFoundException, IllegalArgumentException { 
    return linesFromTo(from, to, fileName, "UTF-8"); 
} 

public static List<String> linesFromTo(int from, int to, String fileName, String charsetName) 
     throws FileNotFoundException, IllegalArgumentException { 

    if(from > to) { 
     throw new IllegalArgumentException("'from' > 'to'"); 
    } 
    if(from < 1 || to < 1) { 
     throw new IllegalArgumentException("'from' or 'to' is negative"); 
    } 

    List<String> lines = new ArrayList<String>(); 
    Scanner scan = new Scanner(new File(fileName), charsetName); 
    int lineNumber = 0; 

    while(scan.hasNextLine() && lineNumber < to) { 
     lineNumber++; 
     String line = scan.nextLine(); 
     if(lineNumber < from) continue; 
     lines.add(line); 
    } 

    if(lineNumber != to) { 
     throw new IllegalArgumentException(fileName+" does not have "+to+" lines"); 
    } 

    return lines; 
} 
+0

用'assert'替換'// assume'並在末尾添加一個';'; – 2010-04-26 15:05:03

+0

另外,是否有使用掃描器而不是簡單的'BufferedReader'的理由?另外:你不指定字符編碼用於從文件讀取,所以你要離開那部分運氣。 – 2010-04-26 15:06:06

+0

@Joachim,好點,我編輯了我的答案!關於'BufferedReader',我認爲(d)這並不重要:我錯了嗎? – 2010-04-26 15:18:43

0

只需簡單地逐行閱讀並計算行號,並開始在您提到的行位置獲取所需的內容。

11

使用BufferedReader.readLine()並計算行數。你只會在內存中保留緩衝區大小和當前行。

不,不可能在沒有閱讀整個文件的情況下到達第3412行(除非你的行都有固定大小)。

0

我會建議使用RandomAccessFile的,這個類可以跳轉到一個特定的位置在文件中。所以,如果你想閱讀文件的最後一行,你不必閱讀所有以前的行,你可以跳轉到該行。

+1

這沒有幫助,因爲字節索引和行號之間沒有固定的關係。一條線可以像你想的那樣長或短,所以你必須讀取數據以知道何時結束。讀取最後一行可以通過這種方式得到改進(除非文件實際上包含一個巨大的行),但通常它不會有幫助。 – 2010-04-26 15:41:31