【问题标题】:File not found in same folder Java在同一文件夹 Java 中找不到文件
【发布时间】:2015-04-25 13:34:23
【问题描述】:

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

【问题讨论】:

  • 可能的原因是,文件不在您认为的位置。您可以使用System.out.println(new File(".").getAbsolutePath()); 之类的东西来测试它,它将输出当前工作目录,这是文件需要驻留的位置。

标签: java


【解决方案1】:

因为File 不是您认为的位置。打印您的程序试图读取的路径。

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

根据File.getCanonicalPath() javadoc,规范路径名既是绝对的又是唯一的。规范形式的精确定义取决于系统。

【讨论】:

  • 但打印结果显示它与我的程序在同一个文件夹中,我希望它在哪里。
  • @JeremyFisher 然后要么文件不在那个文件夹中,要么你有一些其他代码对打开的文件句柄做了一些创造性的事情......你是否也“删除”了文件?
【解决方案2】:

检查 Eclipse 运行配置。查看第二个选项卡“参数”,在底部窗格中显示“工作目录”。那是程序启动的地方,也是它期望找到文件的地方。通常在 Eclipse 中,它会启动您的程序,并将当前工作目录设置为基本项目目录。如果您在源文件夹中有 java 类文件并且正在使用正确的包(例如,“com.mycompany.package”),那么数据文件将位于类似“src/com/mycompany/package”这样的目录中与项目目录不同的目录。

HTH

【讨论】:

    【解决方案3】:

    文件需要在类路径中,而不是在源路径中。将文件复制到输出/类文件文件夹中,它应该可用。

    【讨论】:

    • 我如何将它转移到类路径,甚至知道类路径的位置?
    • 不,它没有。 File f = new File("file.txt"); 表示该文件应位于当前的“工作”目录中。 File 不会在类路径中搜索文件...事实上,它不会在任何地方搜索
    • 他没有使用 getResourceFromStream() ,所以我对将这个小数据文件放入类路径的评论感到非常困惑。
    • 如果只使用文件名/相对路径,则文件将在目录/相对目录中查找类文件,而不是源文件。这就是答案。
    【解决方案4】:

    你应该看看这个问题:Java can't find file when running through Eclipse

    基本上,您需要确定执行的位置(当前目录)以及您的 SO 将如何解析相对路径。尝试更改 Eclipse 中的工作目录 Run Configurations>Arguments 或提供绝对文件名

    【讨论】:

      【解决方案5】:

      我很晚才回复这个问题,但我发现这仍然是一个非常热门的话题。它可能看起来并不明显,但您要在这里使用的实际上是更新的文件处理 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 项目的示例。下一行,我们使用Files 中的方法将文件内容作为String 获取。同样,如果您对文件有不同的用途,您可以查看文档(与 Files 类不同的方法可能对您有用)。在最后一行,我们打印结果。万岁!我们的输出正是我们所需要的。

      你有它,使用Path 而不是File 是解决这个烦人的错误的方法。希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2016-12-15
        • 2021-07-23
        • 2019-05-18
        • 2014-09-03
        • 2018-10-18
        • 2019-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多