如果未调用System.gc(),File.delete()不会删除新文件

时间:2015-03-31 14:11:59

标签: java file

我目前在删除我从未在程序中使用的文件时遇到问题。

首先,这是我的配置:

  • java版本:1.8.0_20
  • os:Windows 7 Pro 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()的情况下解决此问题?

先谢谢

1 个答案:

答案 0 :(得分:1)

对象finalise()方法通常会关闭对象使用过的资源,例如: IO流对象。它们通常会调用close()方法,该方法通常在finally块中调用。

根据Javadocs,当不再引用对象时,GC会调用此方法。由于您不应该依赖此机制,因此您应该在删除文件之前显式关闭正在使用的资源。您可以使用try-with-resources语句自动关闭资源。