我有一个名为“ 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(); } }
免责声明:我想解释一下为什么这种情况适用于这种特殊情况,为什么它可能不适用于其他情况。
为什么起作用:
[当使用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中,它也会失败,因为路径也将不再有效。
话虽这么说,您需要确定文件是否为embedded-resource(或者仅仅是“资源”-有时我会互换使用的术语)。如果是这样,那么您将需要将文件构建到类路径中,并通过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。或者,如果需要的话,您可以得到一个getResourceAsStream
。InputStream
将返回URL对于Maven用户,其目录结构类似于
URL
,getResource()
文件夹的内容位于类路径的根目录。因此,如果其中有文件,则只能使用getResource()
可以使用相对路径,但是它们可能很棘手。最好的解决方案是知道文件的保存位置,即打印文件夹:
[请确保在创建txt文件时没有键入名称“ name.txt”,而只是键入“ name”。如果键入“ name.txt”,则Eclipse将其视为“ name.txt.txt”。这为我解决了。还要将文件保存在src文件夹中,而不是.java所在的文件夹中,而是一个文件夹中。
我有同样的问题,但是你知道为什么吗?因为我没有将.txt放在文件的末尾,所以文件不是textFile,所以您应该做两件事: