Чтение файла из относительного пути в Java: решение ошибок

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы прочитать файл из относительного пути в Java, используйте Class.getResourceAsStream("/относительныйПуть") для случаев, когда файл расположен в classpath, или создайте экземпляр new File("относительныйПуть"), если файл находится относительно корневой директории проекта. Вместо "относительныйПуть" вставьте реальный путь до вашего файла.

Java
Скопировать код
InputStream поток = ВашКласс.class.getResourceAsStream("/файл.txt"); // Если файл в classpath
Java
Скопировать код
File файл = new File("файл.txt"); // Если файл в корневом каталоге проекта

Работая с файлами в classpath, избегайте использования new File(), так как этот метод может не функционировать в JAR-файле. В таких ситуациях предпочтительно использовать URL или InputStream. Для работы с properties-файлами (ключ=значение) удобно применять Properties.load().

Кинга Идем в IT: пошаговый план для смены профессии

Интерпретация путей к файлам и ресурсам

Получение ресурсов внутри classpath

Файлы, вложенные в приложение в качестве ресурсов, используются через classpath. Это похоже на хорошо организованное хранилище.

Java
Скопировать код
URL адресРесурса = ВашКласс.class.getResource("/config/образец-config.json"); // Получение доступа к ресурсу-файлу

Данный метод отлично подходит для работы с ресурсами, включенными в JAR или доступными через classpath, что аналогично виртуальной файловой системе.

Удобная работа с properties-файлами

Чтение properties-файлов с парами ключ=значение можно осуществить следующим образом:

Java
Скопировать код
Properties свойства = new Properties();
свойства.load(new InputStreamReader(
    ВашКласс.class.getResourceAsStream("/config/app.properties"), StandardCharsets.UTF_8)); // Ключи и значения корректно считываются

Такой подход помогает предотвратить ошибки, связанные с кодировкой и форматированием.

Использование в статическом контексте

Java
Скопировать код
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

Java
Скопировать код
try (BufferedReader читатель = new BufferedReader(new InputStreamReader(
    ВашКласс.class.getResourceAsStream("/data.txt"), StandardCharsets.UTF_8))) {
    читатель.lines().forEach(System.out::println); // Выводим содержимое файла на экран
}

BufferedReader эффективнее InputStream, как шведский стол лучше вегетарианского ужина. Выбирайте оптимальную производительность.

Полезные материалы

  1. File (Java Platform SE 8) — подробно о классе File.
  2. IBM Developer — обзор работы с файлами в Java.
  3. Java Guides — применение метода Files.readAllLines в Java NIO для считывания файлов.
  4. Sort JSON by a given order via Array (JavaScript, D3) – Stack Overflow — обучающие материалы по работе с путями в программировании.