68

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

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

但是,当我尝试在以下代码中访问它时,会发生此文件未找到错误:

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();          
    }
}
4

8 回答 8

111

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

Project_Root
    src
    word.txt

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

为什么有效:

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

从命令行运行时

C:\EclipseWorkspace\ProjectRoot\bin > 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 访问它。您需要做的第一件事(在这种特殊情况下)是确保文件被构建到类路径中。使用项目根目录中的文件,您必须配置构建以包含该文件。但是如果你把文件放在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。或者,你可以得到一个URL如果那是你需要的。getResource()将返回一个 URL

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

于 2013-11-09T03:24:16.593 回答
21

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

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();
    }

}

此代码应打印它要查找的文件夹。把文件放在那里,你会很高兴的。

于 2013-11-09T03:22:30.160 回答
3

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

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

Aproject
        src
        word.txt
于 2013-11-09T03:26:09.677 回答
2

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

于 2017-02-15T11:36:33.563 回答
1

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

于 2016-04-12T19:22:55.327 回答
1

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

  1. 将您的文本文件放在根目录中(例如,如果您有一个名为 HelloWorld 的项目,只需右键单击包目录中的 HelloWorld 文件并创建文件
  2. 以您想要的任何名称另存为该文件,但最后带有 .txt 我猜您的问题已解决,但我将其写给其他人知道这一点。谢谢。
于 2018-06-16T15:30:33.787 回答
1

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

File test=new File("check.txt");
if (test.createNewFile()) {
    System.out.println("File created: " + test.getName());
  }
于 2020-05-17T21:57:45.513 回答
-1

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

于 2013-11-09T03:28:48.387 回答