2013-03-26 27 views
0

打开与FileWriter的文件时,我试图写的东西到一个文件中,就像这样:java.io.FileNotFoundException在Java中

FileWriter fw = new FileWriter("somefile.txt", true); 

它当一个进程开始正常工作。像这样:

java -jar XXXXXXX.jar 

但是,当由另一个进程调用它时,将引发IOException。例如:

java.io.FileNotFoundException: 'somefile.txt' (No such file or directory) 
    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)      
+2

定义“其他处理”。你如何开始你的程序? – 2013-03-26 09:40:20

+2

也许是因为该文件不存在于其他进程所在的文件夹中? – 2013-03-26 09:40:30

+0

最有可能的是,您的第一个进程开始使用该文件,并未关闭对该文件的引用。因此,当你的第二个进程试图访问它(追加模式)时,它会抛出'FNFE'。 – SudoRahul 2013-03-26 09:44:29

回答

1

有几种可能的解释:

  1. 过程没有权限在当前目录下创建somefile.txt
  2. 在某些操作系统上,如果文件已经存在并正在被另一个进程使用,则可能无法创建/覆盖该文件。
2

由于异常状态,文件somefile.txt不存在。除非FileWriter构造函数的第二个参数指示要追加到现有文件,这意味着该文件必须存在,否则这将很好。我建议你使用File.exists()检查文件是否存在,如果存在则使用new FileWriter("somefile.txt", true);,否则使用new FileWriter("somefile.txt", false);第一次创建该文件。

0

考虑到FileNotFoundException,它很清楚地表明该文件不存在。

我想你的第二个进程从文件不存在的某个根文件夹开始,使用文件的绝对路径来确保这是问题所在。或者只是使用一个简单的检查

if (yourFile.exists()) 

在您访问它,并且如果不显示该程序使用的路径beeing。

0

的JavaDoc

此异常将由FileInputStream中,FileOutputStream中,和RandomAccessFile的 构造被抛出时,使用指定的路径名​​的文件不存在。如果文件确实存在但由于某种原因无法访问,则这些构造函数也会抛出 ,例如 当尝试打开用于写入的只读文件时。

http://docs.oracle.com/javase/1.5.0/docs/api/java/io/FileNotFoundException.html

也许你已经打开的文件与进程,而不是关闭该文件,因此,如果您尝试打开该文件再次,这些异常将被抛出,因为该文件不能打开两次

1

当启动进程2:

  1. 它会尝试找到somefile.txt在当前目录。

  2. 如果在当前目录中找不到具有给定名称的文件,那么它将尝试创建一个新文件,但由于用户权限无法创建具有给定名称的新文件。

手动检查,文件是否存在或不存在于当前目录中。

3

很多答案错误地建议您发生异常,因为该文件不存在。这不是原因;在documentation for the constructor明确规定:

抛出:
IOException - 如果指定文件存在,但它是一个目录,而不是一个常规文件, 不存在,但无法创建,或不能打开任何其他原因

如果你传递一个相对的文件名(在它没有“/”或字符串“\”),它是指在一个文件当前目录。我猜测,当你使用java -jar运行它时,你的当前目录是你有写权限的目录,但是当其他进程运行它时,当前目录是不可写的。

过去,较旧的Java版本在尝试写入不可写目录时,习惯于抛出FileNotFoundException。但最新的Java似乎并没有这样做,所以我不确定这是否是问题所在。您可以通过使用java.nio.file软件包,而不是得到更清晰的例外:

Path path = Paths.get("somefile.txt"); 
Writer writer = Files.newBufferedWriter(path, Charset.defaultCharset(), 
    StandardOpenOption.APPEND, StandardOpenOption.CREATE); 
+1

在这种情况下,他不应该得到拒绝访问的消息吗? – CloudyMarble 2013-03-26 10:15:57

+0

你是对的,异常消息将以'(Permission denied)'或'(Access is denied)'或类似的东西结束。我敢肯定,我已经看到了一些情况,至少在旧版Java中,无法写入文件导致“没有这样的文件或目录”消息,但我不知道要重新创建它。 – VGR 2013-03-26 10:39:17

相关问题