java.io.FileNotFoundException:系统找不到指定的文件

2022-08-31 14:07:51

我有一个名为“”的文件。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();          
    }
}

答案 1

将单词.txt直接作为项目根文件夹的子级和 src 的对等方

Project_Root
    src
    word.txt

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

为什么它的工作原理:

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

从命令行运行时

C:\EclipseWorkspace\ProjectRoot\bin > java com.mypackage.Hangman1

工作目录为 。对于您的IDE(至少是我使用过的所有IDE),工作目录是.因此,当文件位于 中时,仅使用文件名作为相对路径是有效的,因为它位于工作目录的根目录。C:\EclipseWorkspace\ProjectRoot\binProjectRootProjectRoot

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

为什么它可能不起作用

首先,工作目录总是可以更改的。例如,从命令行运行代码(如上例所示),工作目录是 .因此,在这种情况下,它将失败,因为没有binbin\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 返回一个 ,但在后台获取一个 URL。或者,您可以获得一个如果这是您需要的。getResource() 将返回一个 URLInputStreamURL

对于 Maven 用户,目录结构类似于 ,文件夹的内容放在类路径的根目录下。因此,如果您在那里有一个文件,那么您只会使用src/main/resourcesresourcesgetResourceAsStream("/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();
    }

}

此代码应打印它要查找的文件夹。将文件放在那里,您就可以开始了。