如果没有调用System.gc(),File.delete()无法删除新文件。

6

我目前遇到一个问题,就是在我的程序中有一个我从未使用过的文件无法删除。

首先,这是我的配置:

  • Java 版本:1.8.0_20
  • 操作系统: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()的情况下解决这个问题?
提前感谢。

2
你是怎么创建这个文件的?也许有一个未关闭的FileWriter? - Christian Kuetbach
1个回答

1

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

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


1
抱歉,我的错。因为这不是我的代码,所以我没有看到另一种真正创建文件并填充它的方法。当然,一个未关闭的流被使用了^^。所以是的,System.gc只解决了问题,因为输出流既没有被使用也没有被关闭。谢谢,祝你有美好的一天;) - Torarn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接