4

我正在尝试将某些内容写入文件,如下所示:

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)                       
4

6 回答 6

9

许多答案错误地表明您的异常正在发生,因为该文件不存在。这不是原因;构造函数的文档明确指出:

抛出:
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);
于 2013-03-26T10:06:32.967 回答
2

正如异常所述,该文件somefile.txt不存在。这很好,只是FileWriter构造函数的第二个参数表明您要附加到现有文件,这意味着该文件必须存在。我建议您使用 来检查文件File.exists()是否存在,如果存在则使用new FileWriter("somefile.txt", true);,否则使用new FileWriter("somefile.txt", false);首次创建文件。

于 2013-03-26T09:43:15.300 回答
1

启动进程2时:

  1. 它将尝试在您的当前目录中找到somefile.txt 。

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

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

于 2013-03-26T09:56:38.267 回答
1

有几种可能的解释:

  1. 该进程没有somefile.txt在当前目录中创建的权限。
  2. 在某些操作系统上,如果文件已经存在并且正在被另一个进程使用,则可能无法创建/覆盖该文件。
于 2013-03-26T09:42:04.090 回答
0

JavaDoc

当具有指定路径名的文件不存在时,FileInputStream、FileOutputStream 和 RandomAccessFile 构造函数将引发此异常。如果文件确实存在但由于某种原因不可访问,例如当试图打开只读文件进行写入时,这些构造函数也会抛出它。

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

也许您已经使用进程打开了文件并且没有关闭文件,所以如果您再次尝试打开文件,则会抛出这些异常,因为文件无法打开两次

于 2013-03-26T09:47:01.960 回答
0

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

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

 if (yourFile.exists())

在您访问它之前,如果没有显示程序使用的路径。

于 2013-03-26T09:44:12.383 回答