我正在尝试用Java读取文件。我写了一个程序并将文件保存在与我的程序完全相同的文件夹中。然而,我不断收到FileNotFoundException。这是代码:
public static void main(String[] args) throws IOException {
Hashtable<String, Integer> ht = new Hashtable<String, Integer>();
File f = new File("file.txt");
ArrayList<String> al = readFile(f, ht);
}
public static ArrayList<String> readFile(File f, Hashtable<String, Integer> ht) throws IOException{
ArrayList<String> al = new ArrayList<String>();
BufferedReader br = new BufferedReader(new FileReader(f));
String line = "";
int ctr = 0;
}
...
return al;
}
这是堆栈跟踪:
Exception in thread "main" java.io.FileNotFoundException: file.txt (The system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileReader.<init>(Unknown Source)
at csfhomework3.ScramAssembler.readFile(ScramAssembler.java:26)
at csfhomework3.ScramAssembler.main(ScramAssembler.java:17)
如果文件与程序完全相同,我不明白该文件是如何找到的。我在eclipse中运行程序,并检查了我的运行配置是否有任何杂散参数,但没有。有谁看到了什么错?
答案 0 :(得分:3)
因为File
并不是您认为的地方。打印程序尝试读取的路径。
File f = new File("file.txt");
try {
System.out.println(f.getCanonicalPath());
} catch (IOException e) {
e.printStackTrace();
}
根据File.getCanonicalPath()
javadoc,规范路径名既是绝对路径名也是唯一路径名。规范形式的精确定义取决于系统。
答案 1 :(得分:2)
检查Eclipse运行配置。查看第二个选项卡“Arguments”,在底部窗格中显示“Working Directory”。这是程序启动的地方以及它希望找到文件的位置。通常在Eclipse中,它会启动您的程序,并将当前工作目录设置为基础项目目录。如果您在源文件夹中有java类文件并使用正确的包(例如“com.mycompany.package”),那么数据文件将位于“src / com / mycompany / package”这样的目录中与项目目录不同的目录。
HTH
答案 2 :(得分:0)
文件需要位于类路径中,而不是源路径中。将文件复制到输出/类文件文件夹中,它应该可用。
答案 3 :(得分:0)
您应该查看以下问题:Java can't find file when running through Eclipse
基本上,您需要确定执行的位置(当前目录)以及SO将如何解析相对路径。尝试更改Eclipse中的工作目录&#39; 运行配置&gt;参数或提供绝对文件名
答案 4 :(得分:0)
我回答这个问题的时间非常晚,但我发现这直到今天仍然是一个非常热门的话题。这可能看起来并不明显,但您在这里要使用的实际上是较新的文件处理 i/o 库 java.nio
。下面解释的示例显示了如何从文件路径中读取 String
,但如果您有其他用途,我建议您查看文档。
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Files;
public static void main(String[] args) throws IOException {
Path path = Path.of("app/src/main/java/pkgname/file.txt");
String content = Files.readString(path);
System.out.println(content); // Prints file content
}
好的,代码完成,现在是解释的时候了。我将从导入语句开始。 java.io.IOException
是某些异常处理所必需的。 (旁注:请勿省略 throws IOException
和/或 IOException
导入。否则 Files.readString()
可能会在您的编辑器中引发错误,我将对此进行说明不久)。实际获取文件需要Path
类导入,文件操作需要Files
类导入。
现在,主要功能本身。第一行接收一个 Path
对象,该对象代表一个供您实际读/写的文件。这里就出现了路径名的问题,这是问题的基础。我已经看到其他解决方案告诉您采用文件的绝对路径,但不要这样做!这是非常糟糕的做法,尤其是对于开源或公共代码。 Path.of
实际上允许您使用相对于根文件夹的路径(除非它不在目录中,否则仅输入文件名是行不通的,恐怕)。我给出的示例路径名是 Gradle 项目的一个示例。下一行,我们使用 String
中的方法将文件的内容作为 Files
获取。同样,如果您对文件有不同的用途,您可以查看文档(与 Files
类不同的方法可能对您有用)。在最后一行,我们打印结果。万岁!我们的输出正是我们所需要的。
你知道了,使用 Path
代替 File
是解决这个恼人错误的方法。希望这会有所帮助!