使用java中的filewriter打开文件时,java.io.FileNotFoundException
我正在尝试将某些内容写入文件,如下所示:使用java中的filewriter打开文件时,java.io.FileNotFoundException,java,filenotfoundexception,Java,Filenotfoundexception,我正在尝试将某些内容写入文件,如下所示: 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.FileOut
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)
java.io.FileNotFoundException:'somefile.txt'(没有这样的文件或目录)
位于java.io.FileOutputStream.openAppend(本机方法)
位于java.io.FileOutputStream。(FileOutputStream.java:192)
位于java.io.FileOutputStream。(FileOutputStream.java:116)
位于java.io.FileWriter(FileWriter.java:61)
有几种可能的解释:
somefile.txt
的权限作为例外情况,文件
somefile.txt
不存在。这很好,但构造函数的第二个参数表示您希望附加到现有文件,这意味着该文件必须存在。我建议您使用检查文件是否存在,如果存在,请使用newfilewriter(“somefile.txt”,true)
,否则使用新的FileWriter(“somefile.txt”,false)首次创建文件。考虑到FileNotFoundException,很明显文件不在那里
我猜您的第二个进程是从某个根文件夹开始的,该文件夹中的文件不在那里,请使用文件的绝对路径来确保这是问题所在。或者只是用一个简单的检查
if (yourFile.exists())
在访问它之前,如果没有,则显示程序使用的路径。JavaDoc
FileInputStream、FileOutputStream和RandomAccessFile将引发此异常
当具有指定路径名的文件不存在时的构造函数。它也将被抛出
如果文件确实存在但由于某些原因无法访问,例如
试图打开只读文件进行写入时
可能您使用进程打开了文件,但没有关闭文件,因此如果您再次尝试打开文件,将引发这些异常,因为启动进程2时无法打开文件两次:
手动检查,文件是否存在于您当前的目录中。许多答案错误地表明您的异常正在发生,因为文件不存在。这不是原因;报告明确指出: 抛出: 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);
定义“其他流程”。如何启动程序?可能是因为其他进程所在的文件夹中不存在该文件?很可能是第一个进程开始使用该文件,但没有关闭对该文件的引用。因此,当您的第二个进程尝试访问它(追加模式)时,它会抛出
FNFE
。在这种情况下,他不应该收到拒绝访问的消息吗?您是对的,异常消息将以“(权限被拒绝)”或“(访问被拒绝)”或类似内容结束。我肯定我见过这样的情况,至少在旧版本的Java中,无法编写文件会导致“没有这样的文件或目录”消息,但我不知道如何重新创建它。