此问题已经被问到here。但是提出的解决方案并不令人满意/不能像承诺的那样工作。
问题(在删除dir中的一个文件后删除封闭目录偶尔不起作用)仍然存在于java 8中,无论文件流是否被刷新,关闭,设置为null,System.gc()或者调用Thread.yield()等。只需在短暂睡眠后重试即可。
这是一个小测试程序,可以解决问题:
public static void main(String args[])
{
int run = 0;
try
{
File dir = new File("c:\\testdir");
for (run = 0; run < 10000; run++)
{
dir.mkdirs();
File file = new File(dir, "testfile.txt");
FileOutputStream str = new FileOutputStream(file);
ObjectOutputStream ostr = new ObjectOutputStream(str);
{
ostr.writeObject(Boolean.FALSE);
}
ostr.flush();
ostr.close();
ostr = null;
str.flush();
str.close();
str = null;
Thread.yield();
System.gc();
int retries = 10;
int dretries = 10;
while (! file.delete())
{
if (--retries > 0)
{
Thread.sleep( 10);
}
else
{
throw new Exception( "file.delete");
}
}
while (! dir.delete())
{
if (--dretries > 0)
{
Thread.sleep( 10);
}
else
{
throw new Exception( "dir.delete");
}
}
if (retries != 10 || dretries != 10)
{
System.out.println( "loop:" + run + " - retries:" + retries + " - dretries:" + dretries);
}
if (run % 200 == 0) System.out.println( "loop:" + run);
}
}
catch (Throwable t)
{
t.printStackTrace();
}
System.out.println("run:" + run);
}
可以做些什么来摆脱这个恼人的问题?