解决方法
我没有一个直接的答案(我不认为有一个,这是在操作系统级别(本机),而不是在JVM级别控制)我也没有真正看到答案的价值(一旦发现它是哪个线程,你仍然无法以编程方式关闭文件,但我认为你还不知道当文件仍处于打开状态时通常无法删除.当您没有在InputStream,OutputStream,Reader或Writer上显式调用
Closeable#close()
时,可能会发生这种情况.
基本演示:
public static void main(String[] args) throws Exception { File file = new File("c:/test.txt"); // Precreate this test file first. FileOutputStream output = new FileOutputStream(file); // This opens the file! System.out.println(file.delete()); // false output.close(); // This explicitly closes the file! System.out.println(file.delete()); // true }
换句话说,确保在整个Java IO内容中代码在使用后正确关闭资源. The normal idiom将在the try-with-resources
statement中执行此操作,以便您可以确定无论如何都将释放资源,即使在IOException的情况下也是如此.例如.
try (OutputStream output = new FileOutputStream(file)) { // ... }
为任何InputStream,Reader和Writer等做任何实现AutoCloseable
,你自己打开(使用new关键字).
这在技术上不需要在某些实现上,例如ByteArrayOutputStream,但为了清楚起见,只需遵循最终的近似成语,以避免误解和重构错误.
如果你还没有使用Java 7或更新版本,那么请使用下面的try-finally成语.
OutputStream output = null; try { output = new FileOutputStream(file); // ... } finally { if (output != null) try { output.close(); } catch (IOException logorIgnore) {} }
希望这有助于确定您特定问题的根本原因.