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