FileNotFound(拒绝访问)java.io上的异常

Var*_*har 8 java file-io file-permissions

运行此程序时为什么会出现此错误?这发生在随机迭代之后.通常在第8000次迭代之后.

public static void main(String[] args)
{
    FileWriter writer = null;
    try
    {
        for(int i = 0; i < 10000; i++)
        {
            File file = new File("C:\\Users\\varun.achar\\Desktop\\TODO.txt");

            if(file.exists())
            {
                System.out.println("File exists");
            }
            writer = new FileWriter(file, true);
            writer.write(i);
            System.out.println(i);
            writer.close();
            if(!file.delete())
            {
                System.out.println("unable to delete");
            }

            //Thread.sleep(10);
            //writer = null;
            //System.gc();
        }
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        if(writer != null)
        {
            try
            {
                writer.close();
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

发生异常后,该文件不存在.这意味着它正在删除,但FIleWriter尝试在此之前获取锁,即使它不是多线程程序.是因为Windows没有足够快地删除文件,因此FileWriter没有锁定?如果是这样,那么file.delete()方法在Windows实际删除之前返回?

我如何解决它,因为我在负载测试我的应用程序时遇到了类似的问题.

编辑1:Stacktrace:

java.io.FileNotFoundException: C:\Users\varun.achar\Desktop\TODO.txt (Access is denied)     
at java.io.FileOutputStream.openAppend(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:192)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:116)
    at java.io.FileWriter.<init>(FileWriter.java:61)
Run Code Online (Sandbox Code Playgroud)

编辑2:在程序中添加了file.exists()和file.delete条件.和新的堆栈跟踪:

7452
java.io.FileNotFoundException: C:\Users\varun.achar\Desktop\TODO.txt (Access is denied)
    at java.io.FileOutputStream.openAppend(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:192)
    at java.io.FileWriter.<init>(FileWriter.java:90)
    at com.TestClass.main(TestClass.java:25)
Run Code Online (Sandbox Code Playgroud)

编辑3线程转储

TestClass [Java Application]    
    com.TestClass at localhost:57843    
        Thread [main] (Suspended (exception FileNotFoundException)) 
            FileOutputStream.<init>(File, boolean) line: 192    
            FileWriter.<init>(File, boolean) line: 90   
            TestClass.main(String[]) line: 24   
    C:\Users\varun.achar\Documents\Softwares\Java JDK\JDK 6.26\jdk\jre\bin\javaw.exe (09-Nov-2011 11:57:34 PM)  
Run Code Online (Sandbox Code Playgroud)

编辑4:程序在具有相同操作系统的不同机器上成功运行.现在,我如何确保应用程序在部署的计算机中成功运行?

Var*_*har 0

感谢大家的帮助,但这就是最终解决的方法。

public static void main(String[] args)
    {
        FileWriter writer = null;
        try
        {
            for(int i = 0; i < 10000; i++)
            {
                File file = new File("C:\\tenant-system-data\\abc.txt");
                if(!file.getParentFile().canWrite())
                {
                    System.out.println("parent file error");
                }
                if(file.exists())
                {
                    System.out.println("File exists");
                }
                int count = 0;
                while(count++ < 5)
                {
                    try
                    {
                        file.createNewFile();
                        break;
                    }
                    catch(IOException e)
                    {
                        try
                        {
                            Thread.sleep(100);
                        }
                        catch(InterruptedException e1)
                        {
                            e1.printStackTrace();
                        }

                    }
                }
                writer = new FileWriter(file, true);
                writer.write(i);
                System.out.println(i);
                writer.close();
                if(!file.delete())
                {
                    System.out.println("unable to delete");
                }

                //Thread.sleep(10);
                //writer = null;
                //System.gc();
            }
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if(writer != null)
            {
                try
                {
                    writer.close();
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)