使用Java中的filewriter打开文件时出现java.io.FileNotFoundException

use*_*901 2 java filenotfoundexception

我想写一些文件,像这样:

FileWriter fw = new FileWriter("somefile.txt", true);
Run Code Online (Sandbox Code Playgroud)

它由单个进程启动时正常工作.像这样:

java -jar XXXXXXX.jar
Run Code Online (Sandbox Code Playgroud)

但是当由另一个进程调用它时,将抛出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)                       
Run Code Online (Sandbox Code Playgroud)

VGR*_*VGR 5

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

抛出:
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);
Run Code Online (Sandbox Code Playgroud)