nam*_*123 49 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)
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
Pau*_*tha 86
将word.txt直接作为项目根文件夹的子项和src的对等项
Project_Root
src
word.txt
Run Code Online (Sandbox Code Playgroud)
免责声明:我想解释为什么这适用于这个特定情况以及为什么它可能对其他人不起作用.
为什么会这样:
当您使用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));
Run Code Online (Sandbox Code Playgroud)
getResourceAsStream返回一个InputStream,但在引擎盖下获取一个URL.或者,你可以得到一个URL如果你需要的东西.getResource()将返回一个URL
对于目录结构类似的Maven用户,文件夹src/main/resources的内容resources放在类路径的根目录下.因此,如果你有一个文件,那么你只会使用getResourceAsStream("/thefile.txt")
acd*_*ior 15
可以使用相对路径,但它们可能很棘手.最好的解决方案是知道文件的保存位置,即打印文件夹:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
此代码应该打印它要查找的文件夹.把文件放在那里,你会很高兴.