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,并没有提到最后有一个空间。 确保你没有一个。