【问题标题】:java.io.FileNotFoundException when opening file with filewriter in Javajava.io.FileNotFoundException 在 Java 中使用文件写入器打开文件时
【发布时间】:2013-03-26 09:39:04
【问题描述】:

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

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)                       

【问题讨论】:

  • 定义“其他进程”。你如何开始你的计划?
  • 可能是因为你其他进程所在的文件夹中不存在该文件?
  • 很可能,您的第一个进程开始使用该文件并且没有关闭对它的引用。因此,当您的第二个进程尝试访问它(附加模式)时,它会抛出 FNFE

标签: java filenotfoundexception


【解决方案1】:

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

抛出:
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);

【讨论】:

  • 在这种情况下他不应该收到拒绝访问的消息吗?
  • 你说得对,异常消息将以“(权限被拒绝)”或“(访问被拒绝)”或类似内容结尾。我敢肯定,至少在旧版本的 Java 中,我已经看到了无法写入文件导致“没有这样的文件或目录”消息的情况,但我不知道要重新创建它。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    有几种可能的解释:

    1. 进程无权在当前目录创建somefile.txt
    2. 在某些操作系统上,如果文件已存在并且正在被另一个进程使用,则可能无法创建/覆盖该文件。

    【讨论】:

      【解决方案4】:

      当启动进程2时:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

         if (yourFile.exists())
        

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

        【讨论】:

          【解决方案6】:

          JavaDoc

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

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

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

          【讨论】:

            猜你喜欢
            • 2012-12-07
            • 1970-01-01
            • 2013-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-08
            • 1970-01-01
            相关资源
            最近更新 更多