使用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时无法打开文件两次:

  • 它将尝试在当前目录中查找somefile.txt

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


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

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

    抛出: 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中,无法编写文件会导致“没有这样的文件或目录”消息,但我不知道如何重新创建它。