Java在资源文件夹中找不到文本文件

时间:2018-12-17 23:54:09

标签: java resources text-files filepath project-structure

我似乎无法使用Java来检测我的文本文件。它一直给我一个FileNotFoundException(),我以前可以找到它来查找PNG和TTF文件,但是我不确定是否需要做一些特殊的事情来使其在资源文件夹中找到文本文件。

我正在将Eclipse 2018-19(4.9.0)与OpenJDK 11一起使用。

如何使我的程序设法查找和利用此文本文件?

MCV示例:

public static main(String[] args) {
   generateHumanName();
}

/**
 * Generates a male "human-ish" name from a text file of syllables.
 * @return String The male human name.
 */
private static String generateHumanName() {
   try {
      FileReader("/text/male_human_name_syllables.txt/");
   } catch (IOException e) {
      e.printStackTrace();
   }
      return null; // never called
}

收到异常:

java.io.FileNotFoundException: ../res/text/male_human_name_syllables.txt (No such file or directory)
    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.io.FileInputStream.<init>(FileInputStream.java:93)
    at java.io.FileReader.<init>(FileReader.java:58)
    at mcve.MCVE.generateHumanName(MCVE.java:21)
    at mcve.MCVE.main(MCVE.java:12)

我的文件路径:

enter image description here

1 个答案:

答案 0 :(得分:3)

您正在将该文件放在资源文件夹(res)中:这与在本地文件系统上浏览文件不同(请参见下文):

您需要使用MCV.class.getResourceAsStream("/text/male_human_name_syllables.txt")

try (InputStream is = MCVE.class.getResourceAsStream("/text/male_human_name_syllables.txt")) {
  if (null == is) {
    throw new FileNotFoundException("/text/male_human_name_syllables.txt");
  }
  try (BufferedReader in = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
    // do stuff here
  }
}

我不会对getResourceAsStreamthe javadoc will do better explanation进行过多研究,但是:

  1. 如果资源不存在,则可能返回null。您可能需要将测试移出资源进行尝试。
  2. Eclipse将任何非Java文件复制到输出文件夹(默认情况下为bin)。
  3. 代码末尾的正斜杠是错误的。 Java可能尝试读取目录。
  4. 如果在路径(/text之前不加正斜杠,则该斜杠将相对于调用getResourceAsStream方法的类(和包)。

或者,如果要在某个随机位置读取文件,则应将其传递给程序并读取它(例如:配置Eclipse以使用一些args执行程序)并读取它:

public static main(String[] args) {
   if (args.length < 1) throw new IllegalArgumentException("missing path");
   generateHumanName(args[0]);
}

/**
 * Generates a male "human-ish" name from a text file of syllables.
 * @return String The male human name.
 */
private static String generateHumanName(String path) {
  try (FileReader reader = new FileReader(path)) {

  } catch (IOException e) {
    e.printStackTrace();
  }
  return null; // never called
}

否则,必须将text文件夹移至项目的根目录(res文件夹所在的位置),刷新项目并使用text/male_human_name_syllables.txt(因为这是绝对的路径)。

res/text/male_human_name_syllables.txt可能会起作用(因为它是从项目的根目录执行的)。