2012-04-15 260 views
0

我想逐行讀取大的ASCII文本文件(20GB),並將這些行的一部分複製到單獨的文件中。以下示例代碼在輸出文件中寫入時會丟失數據。我用一些printlns測試了Reader,並按預期工作。我試圖增加BufferedWriter的緩衝區,但沒有改進。 flush()也不起作用。這種情況下的輸出文件應該在40MB左右。使用BufferedWriter書寫時丟失數據

我希望你能幫助我, 問候添

public void split() throws Exception{ 
    BufferedReader inStream = new BufferedReader(new FileReader("input.txt"));  
    BufferedWriter outStream = new BufferedWriter(new FileWriter("output.txt")); 

    for(int i=0;i<700000;i++){ 
     String tempString = inStream.readLine().trim(); 
     if(doOtherStuff(tempString,i)){ 
      break; 
     } 
     outStream.write(tempString); 
     outStream.newLine(); 
    } 
    inStream.close(); 
    outStream.close(); 
} 
+0

爲什麼你使用for循環而不是while循環? – 2012-04-15 13:55:28

+0

我需要複製多少行的信息與文件的第一行一起讀入。我認爲這與問題沒有關係,所以簡單點說吧。 – timmiotooltim 2012-04-15 13:58:35

+0

你不告訴我們什麼數據丟失或在哪裏的具體情況,你不知道你的代碼爲什麼行爲不端,所以***全部***是相關的。我的經驗是,無論你如何計算文件的行數,使用while循環的時候要好得多,並讓BufferedReader讓你知道什麼時候它的行數不足以讀取。這是更多的白癡證明。 – 2012-04-15 14:00:04

回答

0

也許你的意思呢?

for (;;) { 
    String tempString = inStream.readLine(); 
    if (tempString == null) 
     break; 
    tempString = tempString.trim(); 
    if(doOtherStuff(tempString,i)){ 
     continue; // Skip writing, continue with next line 
    } 
    outStream.write(tempString); 
    outStream.newLine(); 
} 

如果沒有空測試,EOF將引發異常。

+0

你說得對,EOF檢查是必要的。但在我目前的情況下,它不是問題,因爲我用System.out.printlns – timmiotooltim 2012-04-15 14:15:43

+0

檢查了讀入數據。readLine()不會在EOF處引發異常。它只是永遠返回null。 – EJP 2012-04-15 22:50:52

+0

@EJP在問題代碼中執行了'readLine()。trim()'操作,當EOF在循環計數器之前時拋出一個NullPointerException異常。 – 2012-04-16 08:44:33