Чтение файла из относительного пути в Java: решение ошибок
Быстрый ответ
Чтобы прочитать файл из относительного пути в Java, используйте Class.getResourceAsStream("/относительныйПуть") для случаев, когда файл расположен в classpath, или создайте экземпляр new File("относительныйПуть"), если файл находится относительно корневой директории проекта. Вместо "относительныйПуть" вставьте реальный путь до вашего файла.
InputStream поток = ВашКласс.class.getResourceAsStream("/файл.txt"); // Если файл в classpath
File файл = new File("файл.txt"); // Если файл в корневом каталоге проекта
Работая с файлами в classpath, избегайте использования new File(), так как этот метод может не функционировать в JAR-файле. В таких ситуациях предпочтительно использовать URL или InputStream. Для работы с properties-файлами (ключ=значение) удобно применять Properties.load().

Интерпретация путей к файлам и ресурсам
Получение ресурсов внутри classpath
Файлы, вложенные в приложение в качестве ресурсов, используются через classpath. Это похоже на хорошо организованное хранилище.
URL адресРесурса = ВашКласс.class.getResource("/config/образец-config.json"); // Получение доступа к ресурсу-файлу
Данный метод отлично подходит для работы с ресурсами, включенными в JAR или доступными через classpath, что аналогично виртуальной файловой системе.
Удобная работа с properties-файлами
Чтение properties-файлов с парами ключ=значение можно осуществить следующим образом:
Properties свойства = new Properties();
свойства.load(new InputStreamReader(
ВашКласс.class.getResourceAsStream("/config/app.properties"), StandardCharsets.UTF_8)); // Ключи и значения корректно считываются
Такой подход помогает предотвратить ошибки, связанные с кодировкой и форматированием.
Использование в статическом контексте
public static void некийМетод() {
InputStream поток = ВашКласс.class.getResourceAsStream("/файл.txt"); // Прямое обращение к ресурсу
//...
}
В статическом контексте класс-обертка ВашКласс.class используется для доступа к актуальному загрузчику классов.
Визуализация
Попробуем представить поиск файлов в Java, как будто это офис:
Акты в шкафу Java-проекта могут быть описаны так:
- Верхний ящик:
src/-> Где мой кофе? - Средний ящик:
resources/-> Ах, вот мой степлер! - Нижний ящик:
config/-> Файлы на любой вкус
Для java.io.File требуется некий ориентир. Поиск 'data.txt'? Путь следующий:
Из src/: выходим в коридор ../, затем входим в resources/:
../resources/data.txt = 🗄️ --> [степлер, файл 'data.txt']
Мы начинаем с текущей позиции и продвигаемся через "коридоры" проекта.
Разъяснение относительных путей
Относительный путь определяется шагами после "./", например, в методе Class.getResource().
Проверка соответствия пути структуре проекта
Убедитесь, что ваш путь соответствует структуре директорий вашего проекта, чтобы избежать FileNotFoundException.
Чтение с помощью BufferedReader
try (BufferedReader читатель = new BufferedReader(new InputStreamReader(
ВашКласс.class.getResourceAsStream("/data.txt"), StandardCharsets.UTF_8))) {
читатель.lines().forEach(System.out::println); // Выводим содержимое файла на экран
}
BufferedReader эффективнее InputStream, как шведский стол лучше вегетарианского ужина. Выбирайте оптимальную производительность.
Полезные материалы
- File (Java Platform SE 8) — подробно о классе
File. - IBM Developer — обзор работы с файлами в Java.
- Java Guides — применение метода
Files.readAllLinesв Java NIO для считывания файлов. - Sort JSON by a given order via Array (JavaScript, D3) – Stack Overflow — обучающие материалы по работе с путями в программировании.


