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

所以我一直坚持这一点。 基本上,我有一个名为“word.txt”创build的文件,每当我运行该程序,它给了我这个错误:

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

具有讽刺意味的是,我在我的java文件所在的同一目录中创build了“word.txt”文件,但仍然给我这个错误。

直接把word.txt作为项目的根文件夹和src的一个子项

 Project_Root src word.txt 

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

为什么它的作品:

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

当你从命令行运行

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

工作目录是C:\EclipseWorkspace\ProjectRoot\bin 。 用你的IDE(至less我所有的工作),工作目录是ProjectRoot 。 因此,当文件在ProjectRoot ,只使用文件名作为相对path是有效的,因为它位于工作目录的根目录。

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

为什么它可能不起作用

首先,工作目录可以随时更改。 例如,像上面例子那样从命令行运行代码,工作目录就是bin 。 所以在这种情况下,它会失败,因为没有bin\word.txt

其次,如果你要将这个项目导出到一个jar文件中,并且configuration文件被包含在jar文件中,它也会失败,因为这个path将不再有效。

这就是说,你需要确定文件是否是一个embedded式资源 (或只是“资源” – 有时我会交替使用的术语)。 如果是这样,那么你将要build立的文件到类path,并通过URL访问它。 首先你需要做的(在这个特定的情况下)是确保文件内置到类path。 使用项目根目录中的文件,您必须configuration构build以包含文件。 但是如果你把文件放在src或下面的某个目录中,那么默认的构build应该把它放到类path中。

您可以通过多种方式访问​​类path资源。 您可以使用具有getResourceXxx方法的Class类来从中获取类path资源。

例如,如果将项目结构更改为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文件夹的内容放在classpath的根目录下。 所以如果你有一个文件,那么你只能使用getResourceAsStream("/thefile.txt")

可以使用相对path,但可能会非常棘手。 最好的解决办法是知道你的文件在哪里被保存,也就是打印文件夹:

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

这段代码应该打印它正在寻找的文件夹。 把文件放在那里,你会很好走。

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

如果您的项目的文件夹名称为例如AProject ,它应该在您的src文件夹在相同的地方。

 Aproject src word.txt 

我认为它总是沸腾到classpath 。 如果你从你的.class文件所在的同一个文件夹中运行,那么改变Scanner input = new Scanner(new File("word.txt")); Scanner input = new Scanner(new File("./word.txt")); 这应该工作

 System.out.println("To Read the file"+input.getCanonicalPath()); try to put it...in your code.... 

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

我正在阅读属性文件的path,并没有提到最后有一个空间。 确保你没有一个。