使用Scanner时出现java.io.FileNotFoundException(文件未找到)错误。我的代码有什么问题?

5

我在NetBeans的“/build/classes”目录下有一个名为“file.txt”的文本文件。

同一目录中,已编译以下代码的.class文件:

try {
File f = new File("file.txt");
Scanner sc = new Scanner(f);
}
catch (IOException e) {
   System.out.println(e);
}

在代码中调试(在“Scanner sc ..”处设置断点)时,会发生异常并打印以下内容:

java.io.FileNotFoundException: file.txt(系统找不到指定的文件)

我还尝试使用“/file.txt”和“//file.txt”,但结果相同。

提前感谢您提供的任何提示。


1
我认为你的问题已经被这个问题的被接受的答案完全回答了:https://dev59.com/b3M_5IYBdhLWcg3wNgKY - user377628
除了Hassan的评论外,我始终在有关文件的错误消息中包含f.getAbsolutePath(),这样我就知道我正在谈论哪个文件。 - Thom
5个回答

7
如果你只使用new File("pathtofile"),那么路径是相对于当前工作目录的,而不一定是你的类文件所在的位置。
如果你确定文件在类路径上某个位置,可以改用以下方式:
URL path = ClassLoader.getSystemResource("file.txt");
if(path==null) {
     //The file was not found, insert error handling here
}
File f = new File(path.toURI());

2

JVM将在当前工作目录中查找文件。

这取决于您的IDE设置(程序如何执行)。

要确定它期望的file.txt文件位于哪里,您可以执行以下操作:

System.out.println(new File("."));

如果它例如输出
/some/path/project/build

你应该将file.txt放在构建目录中(或相对于构建目录指定正确的路径)。


谢谢。现在我尝试一下。但是有一个问题:如果我使用Netbeans编译代码,然后另一个人在另一台计算机的Windows命令行中执行它,它会正常工作还是可能会出现相同的问题? - dragonmnl
只要您提供相对于当前工作目录的文件路径(并且Windows用户从相同的路径启动程序),它就可以正常工作。 - aioobe

1

尝试:

File f = new File("./build/classes/file.txt");

0
Use "." to denote the current directory

String path = "./build/classes/file.txt";

File f = new File(path);

0

文件对象加载,正在查找其当前目录中的匹配项...该目录直接位于您的项目文件夹中,其中加载了类文件,而不是源代码...将文件直接放入项目文件夹中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接