我目前在删除我从未在程序中使用的文件时遇到问题。
首先,这是我的配置:
代码如下:
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()的情况下解决此问题?
先谢谢
答案 0 :(得分:1)
对象finalise()
方法通常会关闭对象使用过的资源,例如: IO流对象。它们通常会调用close()
方法,该方法通常在finally
块中调用。
根据Javadocs,当不再引用对象时,GC会调用此方法。由于您不应该依赖此机制,因此您应该在删除文件之前显式关闭正在使用的资源。您可以使用try-with-resources
语句自动关闭资源。