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

时间:2017-10-12 08:23:27

标签: java delete-file fileoutputstream

此问题已经被问到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);
}

可以做些什么来摆脱这个恼人的问题?

0 个答案:

没有答案