【问题标题】:java.io.FileNotFoundException: the system cannot find the file specifiedjava.io.FileNotFoundException:系统找不到指定的文件
【发布时间】:2013-11-21 05:22:58
【问题描述】:

我有一个名为“word.txt”的文件。

它与我的java 文件位于同一目录中。

但是当我尝试在下面的代码中访问它时,这个 file not found 会发生错误:

Exception in thread "main" java.io.FileNotFoundException: word.txt 
(The system cannot find the file specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.util.Scanner.<init>(Unknown Source)
    at Hangman1.main(Hangman1.java:6)

这是我的代码:

import java.io.File;
import java.util.*;

public class Hangman1 {
    public static void main(String[] args) throws Exception {
        Scanner input = new Scanner(new File("word.txt"));          
        String in = "";         
        in = input.nextLine();          
    }
}

【问题讨论】:

  • 指定文件的完整路径
  • 要么使用已经说过的完整路径,要么在你的程序中创建一个输出文件来查看它的存储位置,然后将你的输入文件移动到那个位置
  • 运行程序时,“word.txt”文件需要和编译器生成的.class文件在同一目录下,而不是.java文件。在像 Netbeans 这样的 IDE 中,将文件放在项目文件夹中,而不是源文件夹中

标签: java file-io filenotfoundexception


【解决方案1】:

直接把word.txt作为项目根文件夹的child,src的peer

Project_Root
    src
    word.txt

免责声明:我想解释一下为什么这适用于这种特殊情况以及为什么它可能不适用于其他情况。

为什么会这样:

当您使用File 或任何其他FileXxx 变体时,您正在寻找文件系统上相对于“工作目录”的文件。工作目录,可以这样描述:

当你从命令行运行时

C:\EclipseWorkspace\ProjectRoot\bin &gt; java com.mypackage.Hangman1

工作目录是C:\EclipseWorkspace\ProjectRoot\bin。使用您的 IDE(至少是我使用过的所有 IDE),工作目录是 ProjectRoot。所以当文件在ProjectRoot时,那么只使用文件名作为相对路径是有效的,因为它在工作目录的根目录下。

同样,如果这是您的项目结构ProjectRoot\src\word.txt,那么路径"src/word.txt" 将是有效的。

为什么它可能不起作用

一方面,工作目录总是可以改变的。例如,像上面的例子一样从命令行运行代码,工作目录是bin。所以在这种情况下它会失败,因为没有bin\word.txt

其次,如果您要将此项目导出到 jar 中,并且文件已配置为包含在 jar 中,它也会失败,因为路径也将不再有效。

话虽如此,您需要确定文件是否为(或只是“资源”——有时我会互换使用的术语)。如果是这样,那么您将希望将文件构建到类路径中,并通过 URL 访问它。您需要做的第一件事(在这种特殊情况下)是确保将文件 built 放入类路径中。使用项目根目录中的文件,您必须配置构建以包含该文件。 但是如果你把文件放在src 或者下面的某个目录中,那么默认构建应该把它放在类路径中。

您可以通过多种方式访问​​类路径资源。您可以使用Class 类,该类具有getResourceXxx 方法,您可以从中获取类路径资源。

例如,如果您将项目结构更改为ProjectRoot\src\resources\word.txt,则可以使用:

InputStream is = Hangman1.class.getResourceAsStream("/resources/word.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));

getResourceAsStream 返回一个InputStream,但在后台获取一个 URL。或者,如果您需要的话,您可以获得URLgetResource() 将返回一个 URL

对于目录结构类似于src/main/resources 的Maven 用户,resources 文件夹的内容放在类路径的根目录下。所以如果你有一个文件,那么你只会使用getResourceAsStream("/thefile.txt")

【讨论】:

    【解决方案2】:

    可以使用相对路径,但它们可能很棘手。最好的办法是知道你的文件保存在哪里,也就是打印文件夹:

    import java.io.File;
    import java.util.*;
    
    public class Hangman1 {
    
        public static void main(String[] args) throws Exception {
            File myFile = new File("word.txt");
            System.out.println("Attempting to read from file in: "+myFile.getCanonicalPath());
    
            Scanner input = new Scanner(myFile);
            String in = "";
            in = input.nextLine();
        }
    
    }
    

    此代码应打印它要查找的文件夹。把文件放在那里就可以了。

    【讨论】:

    • 但他没有收到异常说明该文件未找到吗?如果是这样,File myFile = new File("word.txt"); 将失败。
    • 异常发生在他的代码中的new Scanner(new File())。他应该先声明文件来检查它
    • @user1631616 只有当他尝试打开文件时才会发生异常。 new File("whatever you want"); 不会抛出异常。
    【解决方案3】:

    您的文件应该直接在项目文件夹下,而不是在任何其他子文件夹中。

    如果您的项目的文件夹被命名为例如AProject,它应该与您的src 文件夹位于同一位置。

    Aproject
            src
            word.txt
    

    【讨论】:

      【解决方案4】:

      我正在从属性文件中读取路径,并没有提到最后有一个空格。 确保你没有。

      【讨论】:

        【解决方案5】:

        确保在创建 txt 文件时不要输入名称“name.txt”,只需输入“name”即可。如果您键入“name.txt”,Eclipse 会将其视为“name.txt.txt”。这为我解决了。还将文件保存在 src 文件夹中,而不是 .java 所在的文件夹,向上一个文件夹。

        【讨论】:

          【解决方案6】:

          我也有同样的问题,但你知道为什么吗?因为我没有将 .txt 放在我的文件末尾,所以它是文件而不是文本文件,你应该做两件事:

          1. 将您的文本文件放在根目录中(例如,如果您有一个名为 HelloWorld 的项目,只需右键单击包目录中的 HelloWorld 文件并创建文件
          2. 使用您想要的任何名称另存为该文件,但在该文件的末尾带有 .txt 我想你的问题已经解决了,但我把它写给其他人知道。 谢谢。

          【讨论】:

            【解决方案7】:

            尝试使用代码创建文件,这样你就会知道系统创建文件的路径

            File test=new File("check.txt");
            if (test.createNewFile()) {
                System.out.println("File created: " + test.getName());
              }
            

            【讨论】:

              【解决方案8】:

              我认为它总是归结为classpath。话虽如此,如果您从 .class 所在的同一文件夹运行,则将 Scanner input = new Scanner(new File("word.txt")); 更改为 Scanner input = new Scanner(new File("./word.txt")); 应该可以工作

              【讨论】:

              • 这个答案不正确。当前工作目录和类路径可以完全不同。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-01-11
              相关资源
              最近更新 更多