2012-02-22 70 views
2

在我的應用程序中,我正在寫一個文件來存儲一些執行信息,一旦執行完成,我想刪除臨時文件。這個問題甚至在文件關閉或流清除後我無法刪除文件。我試過Java文件刪除和System.gc()

Thread.sleep(1000); 
file.delete(); 

並且沒有刪除文件。然後我創建了一個while循環

while(!file.delete()) 
    Thread.sleep(1000); 

並且它一直循環。然後我添加

System.gc(); 
file.delete(); 

它的工作!

我已驗證我已優雅地關閉或刷新文件。我想知道爲什麼我的代碼與System.gc()一起工作?

+6

在嘗試刪除文件之前,請確保您已關閉所有打開的文件流。 – mre 2012-02-22 16:26:12

+0

這仍然是事實。這是一個與Windows相關的bug JDK-4715154。可能這就是爲什麼在Scala運行時庫中有特殊的'scala.compat.Platform.collectGarbage()'條目。 – Epicurist 2014-08-18 11:46:28

回答

3

這似乎表明您沒有撥打close()

原因:在java中的開始時間,使用了Object.finalize()方法來清理垃圾收集,以及I/O它做了一個close()

直到文件正在使用(未關閉),該文件無法在Windows上刪除。

0

你想要使用的是File.createTempFile()並且在結果文件上調用deleteOnExit()。它將在您執行結束時管理清理臨時文件。您不應該手動執行此操作,請讓系統爲您執行此操作,這就是爲什麼他們將它包含在標準庫中的原因。

此外,您應該始終致電.close()以確保將所有數據刷新到文件中,並且可以正確清理手柄。

+1

File.createTempFile()不執行任何清理工作。它只是在臨時目錄中創建一個具有唯一名稱的文件。應用程序在完成後仍應刪除該文件。 – 2012-02-22 17:12:33