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

标签 java file

<分区>

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

首先,这是我的配置:

  • 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 在文件上保留了一些资源,即使它从未被使用过。

我的问题是:

How can I solve this problem without using System.gc() ?

提前致谢

最佳答案

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

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

关于java - 如果未调用 System.gc(),则 File.delete() 不会删除新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29370676/

相关文章:

ios - 我们如何才能确定文件*不*存在于 iOS 中?

java - 如何在特定索引处获取 TreeMap 的键和值

Java消息系统

java - UnableToExecuteStatementException : Batch entry was aborted. 调用getNextException查看原因

c - (C) 当以文本模式而不是二进制模式写入文件时,哪些字符会受到影响?

java - 在 Java 中将字符串转换为文件

java - 如何在 Java 中隐藏当前的 JPanel 并显示一个带有按钮的新面板?

java - 使用 JQuery 和 Java 在 Play Framework 中构建自动保存功能,但遇到 400 Bad Request 或 404 Not Found 错误

file - 如何打印分隔类型文件中特定行的特定字段

python - 从 Flask 请求模块读入文件