2016-04-27 58 views
1

我正在寫一個Java程序,執行以下操作:如何在閱讀該行後逐個刪除文件中的所有行?

  1. 在一條線上從文件中讀取
  2. 是否基於該行
  3. 刪除線的一些動作(或""更換) ,如果2不成功,將其寫入到一個新的文件
  4. 繼續上對文件中的所有行的下一行(而不是刪除任意線)

薑黃素rently我:

try (BufferedReader br = new BufferedReader(new FileReader(inputFile))) { 
      String line;     
      while ((line = br.readLine()) != null) { 
       try { 
        if (!do_stuff(line)){ //do_stuff returns bool based on success 
         write_non_success(line); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); //eat the exception for now, do something in the future 
      } 
     } 

很顯然,我將需要不使用一個BufferedReader這一點,因爲它不能寫,但我應該用什麼課?讀取順序並不重要

這與this question不同,因爲我想刪除所有行,而不是像其他OP所需的任意行號,並且如果可能,我想避免寫入臨時文件每行之後,因爲我的文件大約有一百萬行

+0

您無法同時讀取和寫入文件。您需要在內存或文件系統中創建一個副本,然後寫出一個不同的文件。 –

+1

您無法真正刪除該行。刪除一條線意味着將所有剩餘的文本進行物理移位,而您確實不想這樣做。 – Andreas

回答

4

如果您根據所描述的算法執行所有操作,則原始文件中保留的內容將與步驟#中「新文件」的內容相同3:

  • 如果某一行成功處理,它將從原始文件中刪除
  • 如果一行未成功處理,它將被添加到新文件中,並且它也保留在原始文件中。

很容易看出爲什麼在這個過程結束時原始文件與「新文件」是一樣的。你所需要做的就是將算法執行到最後,然後將新文件複製到原來的位置。

如果您擔心該過程會在中間發生崩潰,情況會變得非常不同:現在您必須在處理每行後寫出原始文件的當前狀態,而不必在原始文件上寫下直到您相信它會處於一致的狀態。您可以通過將所有行讀入列表,從列表中刪除第一行,將整個列表的內容寫入臨時文件,然後將其複製到原來的位置。顯然,這是非常昂貴的,所以不應該在緊密的循環中嘗試。但是,這種方法可以確保原始文件不會處於不一致的狀態,這對於避免多次執行同一工作非常重要。

+0

如果擔心該過程中途中斷,並且無法再次處理線路,則應使用其他跟蹤進度的方式。如果不是問題,這是正確的答案。 – Andreas

+0

這是一個很好的觀點,而我最終沒有考慮過兩個文件是相同的。我已經編輯了一個更清晰的問題[email protected]安德烈亞斯對我的擔憂是正確的 - 儘管如此 - 關鍵是要防止中途死亡的過程通過 – Mitch

+0

@Musher你的過程預計會在大部分時間內完成,但是偶爾會不時崩潰 - 比如說,不到一次一百次運行? – dasblinkenlight