2011-02-13 71 views
3

我編寫了一個程序,我使用Scanner從日誌文件讀取行並解析每行以找到重要的內容。我閱讀日誌文件的每一行非常重要。我寫了下面這段代碼來掃描每一行java.util.Scanner在讀取大文件時出現故障

Scanner s = new Scanner(new File("Large.log")); 
while(s.hasNextLine()) 
{ 
    String line = s.nextLine(); 
    //do the processing of the log line 
} 

上面的代碼表現得很怪異。它會在隨機數行(大約100萬行後)後停止讀取行。我修改了上面的代碼來檢查最後一行讀取,並使用Notepad ++檢查了日誌文件。在特定行之後的文件中還有很多行。在while循環結束後,我添加了另一個System.out.println(s.hasNextLine()),它打印爲false。

但是,如果我嘗試使用BufferedReader來執行上述操作,則該程序可以正常工作。 Java中的util IO類有任何限制嗎?

+0

當你使用BufferedReader時,你使用的是readLine()還是read()?還有最後一行是隨機讀取的還是固定的,或者是通過打印輸出到文件或屏幕確定的「隨機行數」? – 2011-02-13 06:32:30

+0

我使用了相同的readLine。最後一行是隨機的。讀取的行數是隨機的。 – 2011-02-13 06:40:47

回答

3

這聽起來像您的特定JVM實現的large file support問題。大量標準文件I/O在32位操作系統上無法處理大於4 GB的文件是一個常見問題。通常有文件API的替代版本來明確支持大文件,但實現JVM的人員必須記住使用這些文件。出於好奇,你使用的操作系統是64位嗎?

0

我只是將包含50個字符的字符串轉儲到一個臨時文件,重複該字符串500萬次。當我嘗試逐行讀取文件時,Scanner對我來說工作正常。

我看到你的情況下,兩個可能的問題:

  1. 可能是你正在試圖讀取經過掃描儀的內部緩衝區大小,用於讀取一條線一個巨大的線?
  2. 雖然不太可能,但我希望不同的進程/線程對同一文件沒有併發的修改。