2012-02-29 121 views
0

我有這種方法獲取.txt文件的最後一行,並創建一個沒有該行的新臨時文件。但是,當我嘗試刪除具有我想要刪除的行的.txt(因此我可以重命名臨時文件)出於某種原因,我不能。這是代碼:無法刪除文件Java

void removeFromLocal() throws IOException { 
    String lineToRemove = getLastLine(); 
    File inputFile = new File("nexLog.txt"); 
    File tempFile = new File("TempnexLog.txt"); 
    BufferedReader reader = null; 
    BufferedWriter writer = null; 
    try { 

     reader = new BufferedReader(new FileReader(inputFile)); 
     writer = new BufferedWriter(new FileWriter(tempFile)); 

     String currentLine; 
     int i = 0; 
     while ((currentLine = reader.readLine()) != null) { 
      i++;     
      String trimmedLine = currentLine.trim(); 
      if (!trimmedLine.equals(lineToRemove)) { 
       if (i != 1) { 
        writer.newLine(); 
       } 
       writer.write(currentLine); 
      } 
     } 
      reader.close(); 
      reader = null; 
      writer.flush(); 
      writer.close(); 
      writer = null; 
      System.gc(); 

      inputFile.setWritable(true); 

      if (!inputFile.delete()) { 
       System.out.println("Could not delete file"); 
       return; 
      } 


      if (!tempFile.renameTo(inputFile)) { 
       System.out.println("Could not rename file"); 
      } 
     //boolean successful = tempFile.renameTo(inputFile); 
    } catch (IOException ex) { 
     Logger.getLogger(dropLog.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

請告訴我有趣的是,當我按下調用該方法一次按鈕,沒有任何反應(「無法刪除文件」),它工作正常,第二次和第三次,我得到「無法重命名文件「。

+1

熟悉'finally'塊。它將幫助您以正確和清晰的方式關閉文件。 – Jagger 2012-02-29 16:50:12

回答

1

請問BufferedReader關閉嵌套的閱讀器(在文檔中沒有提到)?您必須確認,通過檢查setWritable是否成功。否則,您也需要關閉FileReader,我建議您,因爲如果您關閉兩次,則不會造成危害......順便說一下,GC呼叫比有用的更有害。

+0

我不跟着你,什麼嵌套的讀者?忍受我Im初學者:S 我添加了.setWritable和GC。只是爲了確保,因爲我不知道代碼出了什麼問題。我刪除它,仍然繼續得到相同的錯誤。 – Dangerosking 2012-02-29 17:01:24

+0

哦,再次閱讀答案,看到我沒有關閉代碼的另一部分的讀者,我關閉它,它的工作,謝謝:) – Dangerosking 2012-02-29 17:22:54

3

該文件在被其他進程打開時無法刪除。例如。在記事本中,或者甚至可以在你的代碼中的其他地方使用另一個FileReader/FileWriter。另外,當您在IDE內部執行此操作時,您將面臨在後臺掃描期間IDE將觸摸文件以修改項目文件夾中的文件的風險。而是將文件存儲在IDE項目外部的絕對路徑中。

此外,必須修改打開和關閉文件的代碼流程,以便在finally塊中執行關閉。成語是這樣的:

Reader reader = null; 

try { 
    reader = new SomeReader(file); 
    // ... 
} finally { 
    if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} 
} 

或者,如果你已經對Java 7中,使用automatic resource management代替。

try (Reader reader = new SomeReader(file)) { 
    // ... 
} 

此外,我建議使用File#createTempFile()來創建臨時文件。這樣就會生成一個唯一的臨時文件名,因此可以防止多個進程寫入和重命名完全相同的臨時文件。

File tempFile = File.createTempFile("nexLog", ".txt");