Ответ 1
Поместите word.txt непосредственно как дочерний элемент корневой папки проекта и одноранговый src
Project_Root
src
word.txt
Отказ от ответственности: Я хотел бы объяснить, почему это работает для этого конкретного случая и почему это может не работать для других.
Почему это работает:
Когда вы используете File
или любой другой вариант FileXxx
, вы ищете файл в файловой системе относительно "рабочего каталога". Рабочий каталог можно описать следующим образом:
При запуске из командной строки
C:\EclipseWorkspace\ProjectRoot\bin > java com.mypackage.Hangman1
рабочий каталог C:\EclipseWorkspace\ProjectRoot\bin
. С вашей IDE (по крайней мере, с теми, с которыми я работал) рабочим каталогом является ProjectRoot
. Поэтому, когда файл находится в ProjectRoot
, используйте только имя файла, поскольку относительный путь действителен, потому что он находится в корневой директории.
Аналогично, если это была ваша структура проекта ProjectRoot\src\word.txt
, тогда был бы допустим путь "src/word.txt"
.
Почему он не работает
Во-первых, рабочий каталог всегда может меняться. Например, запустив код из командной строки, как в приведенном выше примере, рабочим каталогом является bin
. Таким образом, в этом случае он потерпит неудачу, поскольку не существует bin\word.txt
Во-вторых, если вы собираетесь экспортировать этот проект в банку, и файл был настроен для включения в банку, он также потерпит неудачу, так как путь уже не будет действительным.
При этом вам нужно определить, должен ли файл быть embedded-resource (или просто "ресурс" - термины, которые иногда я буду использовать взаимозаменяемо). Если это так, тогда вы захотите создать файл в пути к классам и получить к нему доступ через URL-адрес. Первое, что вам нужно сделать (в данном конкретном случае) - убедиться, что файл встроен в путь к классам. С файлом в корне проекта вы должны настроить сборку для включения файла. Но если вы поместите файл в src
или в некоторый каталог ниже, то сборка по умолчанию должна поместить его в путь класса.
Вы можете получить доступ к ресурсу classpath несколькими способами. Вы можете использовать класс Class
, у которого есть метод getResourceXxx
, из которого вы используете для получения ресурсов classpath.
Например, если вы изменили структуру проекта на ProjectRoot\src\resources\word.txt
, вы можете использовать это:
InputStream is = Hangman1.class.getResourceAsStream("/resources/word.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
getResourceAsStream
возвращает InputStream
, но получает URL-адрес под капотом. Кроме того, вы можете получить URL
, если это вам нужно. getResource()
вернет URL
Для пользователей Maven, где структура каталогов похожа на src/main/resources
, содержимое папки resources
помещается в корень пути к классам. Поэтому, если у вас есть файл, вы можете использовать getResourceAsStream("/thefile.txt")