【问题标题】:Always receiving FileNotFoundException, even with file in SRC folder总是收到 FileNotFoundException,即使文件在 SRC 文件夹中
【发布时间】:2017-07-15 01:22:35
【问题描述】:

我目前正在尝试编写一个程序,该程序将逐行读取文件并将每一行添加到arrayList。我的另一个功能应该是对该缓冲区中的项目进行排序,然后将它们写入文本文件。但是,即使我的文件位于 src 目录以及包含 .class 文件的目录中,我也会不断收到 FileNotFoundException。我的代码如下

public static ArrayList<String> readDictionary(String filename, 
ArrayList<String> buffer) throws IOException, FileNotFoundException {
    File f = new File(filename);
    Scanner fileIn = new Scanner(f);
    //Scanner fileIn = new Scanner(new File(filename));
    boolean add = true;

    while (fileIn.hasNextLine() == true) {
        for (String s : buffer) {
            if (fileIn.nextLine().equals(s)) {
                add = false;
            }
        }
        if (add == true) {
            buffer.add(fileIn.nextLine());
        }
        add = true;
    }
    fileIn.close();
    return buffer;
}

public static void writeDictionary(String filename, ArrayList<String> buffer) throws IOException, FileNotFoundException {
    File f = new File(filename);
    Collections.sort(buffer, String.CASE_INSENSITIVE_ORDER);
    Path file = Paths.get(filename);
    Files.write(file, buffer);
}

public static void main(String[] args) throws IOException, FileNotFoundException{
    ArrayList<String> buffer = new ArrayList<>();
    readDictionary("inputtest.txt", buffer);
}

Exception in thread "main" java.io.FileNotFoundException: inputtest.txt (The system cannot find the file specified)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.util.Scanner.<init>(Scanner.java:611)
at UltimateDictionary.readDictionary(UltimateDictionary.java:18)
at UltimateDictionary.main(UltimateDictionary.java:46)

我通过将文件名设置为“inputtest.txt”来测试这个程序,并且该文件与 .java 文件位于我的 src 目录中,但它仍然抛出错误。另外,如何关闭文件? f.close() 给我一个错误。

【问题讨论】:

  • 能否提供详细的错误信息?
  • 我在错误信息中进行了编辑,以及我用来测试它的主要方法。当文本文件位于目录中时,我看不到我是如何收到此错误的。
  • 提供绝对路径怎么样?这可能是因为应用程序是从另一个工作目录启动的。
  • 您没有从您的src 目录执行。 Ergo 一个放在那里的文件不会仅通过其名称找到。
  • @EJP 你知道它会从哪里执行吗?我写了一个早期的程序,它必须读取图像文件,并将图像放在“src”目录中是允许它们被读取的。

标签: java file exception file-io


【解决方案1】:

你的 src 或 .class 目录中的文件,只能表示该文件在类路径中,而 new File(filename);搜索当前工作目录。要搜索类路径,请更改 readDictionary 方法,在 File f = new File(filename); 之后添加:

    if (!f.exists()) {
        URL url = <yourclassname>.class.getResource(filename);
        if (url != null)
            f =  new File(url.getPath());
    }

你必须使用 yourclassname.class 因为方法是静态的。也应该工作:

if (url == null)
    url = ClassLoader.getSystemResource(filename);

【讨论】:

  • 如果应用程序被打包在 JAR 中,该 URL 甚至都不会成为文件 URL,这是正常的。
  • @EJP 问题是关于目录,而不是 jar 文件。 你的说法完全是误导,并没有增加任何知识。 如果他想从 jar 中读取文件,他应该使用 getResourceAsStream,得到一个 inputStream,但这不是想要的,作为需要常规文件。
  • @EJP 应用程序可以打包在一个jar中,但这并不意味着构建过程包括任何东西,那么应用程序可以是e web应用程序所以src里面的内容通常 打包在 WEB_INF/classes 中,谁能告诉?
  • 这正是我的观点。由于您比我更不知道这个问题的答案,因此您没有任何理由假设 URL 将是一个文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 2021-05-26
  • 2014-11-01
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
相关资源
最近更新 更多