2015-03-31 99 views
6

我目前在刪除一個我從未在我的程序中使用的文件時遇到問題。如果不調用System.gc(),File.delete()不會刪除新文件

首先,這裏是我的配置:

  • Java版本:1.8.0_20
  • 操作系統:Windows 7專業版SP1

的代碼如下:

File out = new File(workingDirectory, filePrefix + "download"); 

// cleanup old failed runs 
//System.gc(); // Bad! but seems the only way to pass the test 
boolean isDeleted = out.delete(); 
assertTrue("Couldn't clear output location (" 
      + " isDeleted="+isDeleted 
      + " exists="+out.exists() 
      + " canWrite="+out.canWrite() 
      + ")", !out.exists()); 

輸出錯誤跟蹤爲:

junit.framework.AssertionFailedError: 
Couldn't clear output location (isDeleted=false exists=true canWrite=true) 
at [...] 

如果我取消註釋System.gc(),在我看來這是不好的,這個錯誤就解決了。看起來Windows即使從未使用過,也會在文件上保留一些資源。

我的問題是:

我怎樣才能解決這個問題,而無需使用System.gc()的?

由於通過預先

+2

你是如何創建文件的?也許有一個未關閉的FileWriter? – 2015-03-31 14:18:09

回答

1

對象finalise()方法已經使用由對象通常接近資源,例如IO流對象。它們通常會調用close()方法,該方法通常會在finally塊中調用。

根據Javadocs,當對象不再被引用時,由GC調用此方法。由於您不應該依賴此機制,因此您應該在刪除文件之前明確地關閉正在使用的資源。您可以使用try-with-resources語句自動關閉資源。

+1

對不起,我的壞。由於這不是我的代碼,我沒有看到另一個真正創建該文件的方法,並填充了一些字節。當然還有一個未封閉的流被使用^^。所以是的,System.gc只是解決了這個問題,因爲輸出流沒有被使用也沒有關閉。謝謝你,祝你有美好的一天;) – Torarn 2015-04-01 08:08:39

相關問題