【发布时间】:2011-12-25 22:34:27
【问题描述】:
为什么我在运行这个程序时会收到这个错误?这发生在随机迭代之后。通常在第 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();
}
}
}
}
异常发生后,文件不存在。这意味着它正在删除,但 FIleWriter 尝试在此之前获取锁,即使它不是多线程程序。是不是因为 Windows 没有足够快地删除文件,因此 FileWriter 没有获得锁定?如果是这样,那么 file.delete() 方法会在 windows 实际删除它之前返回?
我该如何解决它,因为我在对我的应用程序进行负载测试时遇到了类似的问题。
编辑 1:堆栈跟踪:
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)
EDIT 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)
编辑 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)
EDIT 4:程序在具有相同操作系统的不同机器上成功运行。现在我如何确保应用程序在部署它的机器上成功运行?
【问题讨论】:
-
有什么异常,你还想测试什么?
-
Thread.sleep()似乎有帮助,但我不能将它放入程序中,否则需要一个半世纪才能完成执行。我可以尝试获取锁直到它成功,但是有更好的方法吗? -
我会首先尝试检查
delete()的返回值——它总是true吗?异常是来自writer.close(),还是来自writer.write(),还是在创建writer时?另外,“获得锁”是什么意思?我在程序中没有看到任何锁。 -
@VarunAchar 有什么例外?并发布堆栈跟踪。
-
@Joonas:锁定 FileWriter 以写入文件。
标签: java file-io file-permissions