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

时间:2013-11-09 03:13:55

标签: java file-io filenotfoundexception

我有一个名为“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();          
    }
}

8 个答案:

答案 0 :(得分:83)

将word.txt直接作为项目根文件夹的子项和src的对等项

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或下面的某个目录中,则默认构建应将其放入类路径中。

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

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

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

getResourceAsStream会返回InputStream,但会在后面获取一个网址。或者,如果您需要,可以获得URLgetResource()将返回一个网址

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

答案 1 :(得分:14)

可以使用相对路径,但它们可能很棘手。最好的解决方案是知道文件的保存位置,即打印文件夹:

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

}

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

答案 2 :(得分:2)

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

如果项目的文件夹是以例如AProject,它应与您的src文件夹位于同一位置。

Aproject
        src
        word.txt

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

我有同样的问题,但你知道为什么吗?因为我没有把.txt放在我文件的末尾,所以文件不是textFile,你只做两件事:

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

答案 6 :(得分:1)

尝试使用代码创建文件,这样您将了解系统创建文件的路径

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

答案 7 :(得分:-1)

我认为它始终归结为classpath。话虽如此,如果您从.class所在的同一文件夹运行,那么将Scanner input = new Scanner(new File("word.txt"));更改为Scanner input = new Scanner(new File("./word.txt"));应该有效