Вы помещаете этот файл в папку ресурсов (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 даст лучшее объяснение , но:
- Может вернуться
null
если ресурс не существует.Возможно, вам придется переместить тест за пределы попытки с ресурсами. - Eclipse копирует любой файл, не являющийся Java, в выходную папку (
bin
по умолчанию). - Косая черта в концеВаш код неверен.Java, вероятно, пытается прочитать каталог.
- Если вы не поставите косую черту перед путем (
/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
сработает (поскольку выполняется из корня проекта).