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

问题描述 投票:52回答:8

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

java file-io filenotfoundexception
8个回答
90
投票

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

为什么起作用:

[当使用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访问它。在这种情况下,您需要做的第一件事就是确保文件

built

进入类路径。将文件放在项目根目录中,您必须配置构建以包括该文件。

但是

如果将文件放在src或下面的某个目录中,则默认版本应将其放在类路径中。

您可以通过多种方式访问​​类路径资源。您可以使用Class类,该类具有Class方法,可用于从中获取类路径资源。例如,如果您将项目结构更改为getResourceXxx,则可以使用此方法:

ProjectRoot\src\resources\word.txt

InputStream is = Hangman1.class.getResourceAsStream("/resources/word.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 返回getResourceAsStream,但在后台获取URL。或者,如果需要的话,您可以得到一个getResourceAsStreamInputStream将返回URL

对于Maven用户,其目录结构类似于URLgetResource()文件夹的内容位于类路径的根目录。因此,如果其中有文件,则只能使用getResource()

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


15
投票

2
投票

2
投票

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


1
投票

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


1
投票
将文本文件放入根目录(例如,如果您有一个名为HelloWorld的项目,只需右键单击包Directory中的HelloWorld文件并创建File

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.