Java 关闭使用FileOutputStream创建的文件,以便下次删除封闭目录

Java 关闭使用FileOutputStream创建的文件,以便下次删除封闭目录,java,delete-file,fileoutputstream,Java,Delete File,Fileoutputstream,这个问题已经提出了。但是,那里提出的解决方案并不令人满意/不符合承诺 问题(在删除目录中的一个文件后删除封闭目录有时不起作用)仍然存在于java 8中,无论文件流是否被刷新、关闭、设置为null、调用System.gc()或Thread.yield()等。只需在短暂睡眠后重试即可成功 下面是一个小测试程序,可以解决此问题: public static void main(String args[]) { int run = 0; try { File d

这个问题已经提出了。但是,那里提出的解决方案并不令人满意/不符合承诺

问题(在删除目录中的一个文件后删除封闭目录有时不起作用)仍然存在于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);
}
publicstaticvoidmain(字符串参数[])
{
int run=0;
尝试
{
文件目录=新文件(“c:\\testdir”);
对于(运行=0;运行<10000;运行++)
{
dir.mkdirs();
File File=新文件(dir,“testfile.txt”);
FileOutputStream str=新的FileOutputStream(文件);
ObjectOutputStream OSR=新的ObjectOutputStream(str);
{
ost.writeObject(Boolean.FALSE);
}
ost.flush();
ost.close();
ostr=null;
str.flush();
str.close();
str=null;
螺纹屈服强度();
gc();
int重试次数=10次;
int=10;
而(!file.delete())
{
如果(--重试次数>0)
{
睡眠(10);
}
其他的
{
抛出新异常(“file.delete”);
}
}
而(!dir.delete())
{
如果(--dretries>0)
{
睡眠(10);
}
其他的
{
抛出新异常(“dir.delete”);
}
}
如果(重试次数!=10次)
{
System.out.println(“循环:+run+”-retries:+retries+”-dretries:+dretries”);
}
if(运行%200==0)System.out.println(“循环:+run”);
}
}
捕获(可丢弃的t)
{
t、 printStackTrace();
}
System.out.println(“run:+run”);
}
怎样才能摆脱这个烦人的问题呢