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

Java can't find text file in resource folder

我似乎无法 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)

我的文件路径:

您正在将此文件放在资源文件夹中 (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. 如果资源不存在,可能会returnnull。您可能需要使用资源将测试移到 try 之外。
  2. Eclipse 将任何非 java 文件复制到输出文件夹(默认为 bin)。
  3. 您代码末尾的正斜杠是错误的。 Java 可能尝试读取目录。
  4. 如果您没有在路径前放置正斜杠 (/text),它将相对于您调用 getResourceAsStream 的 class(和包)方法。

或者,如果您想在某个随机位置读取文件,您应该将它(例如:配置 Eclipse 以使用一些参数执行您的程序)传递给您的程序并读取它:

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 可能会起作用(因为它从项目的根目录执行)。