在相同的文件夹Java中找不到文件

时间:2015-02-24 02:20:37

标签: java

我正在尝试用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中运行程序,并检查了我的运行配置是否有任何杂散参数,但没有。有谁看到了什么错?

5 个答案:

答案 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 是解决这个恼人错误的方法。希望这会有所帮助!