Чтение файла из относительного пути в 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 — обучающие материалы по работе с путями в программировании.