Java не может найти текстовый файл в папке ресурсов - PullRequest
0 голосов
/ 18 декабря 2018

Я не могу заставить 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 голосов
/ 18 декабря 2018

Вы помещаете этот файл в папку ресурсов (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
  }
}

Я не буду слишком углубляться в getResourceAsStream, , javadoc даст лучшее объяснение , но:

  1. Может вернуться null если ресурс не существует.Возможно, вам придется переместить тест за пределы попытки с ресурсами.
  2. Eclipse копирует любой файл, не являющийся Java, в выходную папку (bin по умолчанию).
  3. Косая черта в концеВаш код неверен.Java, вероятно, пытается прочитать каталог.
  4. Если вы не поставите косую черту перед путем (/text), он будет относительно класса (и пакета), для которого вы вызываете getResourceAsStream method.

В качестве альтернативы, если вы хотите прочитать файл в некотором случайном месте, вы должны передать его (например, настроить 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 сработает (поскольку выполняется из корня проекта).

...