Как получить абсолютный путь к файлу в папке /resources вашего проекта

Предположим, что стандартная настройка maven.

Скажите в папке ресурсов, что у вас есть файл abc.

В Java, как я могу получить абсолютный путь к файлу, пожалуйста?

Ответ 1

Вы можете использовать метод ClassLoader.getResource чтобы получить правильный ресурс.

URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();

ИЛИ ЖЕ

Хотя это может не работать постоянно, более простое решение -

Вы можете создать объект File и использовать метод getAbsolutePath:

File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();

Ответ 2

Правильный способ работы:

URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();

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

(Казалось, очевидный new File(resource.getPath()) не работает для всех путей! Путь по-прежнему кодируется URL-адресом!)

Ответ 3

Необходимо указать путь, начинающийся с /

URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();

Ответ 4

Создайте экземпляр classLoader нужного вам класса, тогда вы сможете легко получить доступ к файлам или ресурсам. Теперь вы getPath() доступ к пути, используя getPath() этого класса.

 ClassLoader classLoader = getClass().getClassLoader();
 String path  = classLoader.getResource("chromedriver.exe").getPath();
 System.out.println(path);

Ответ 5

Чтобы вернуть файл или путь к файлу

URL resource = YourClass.class.getResource("abc");
File file = Paths.get(resource.toURI()).toFile(); // return a file
String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath();  // return file path

Ответ 6

На пути к абсолютному пути есть две проблемы:

  1. Найденное место размещения будет находиться не там, где лежат исходные файлы, а там, где сохранен класс. И папка ресурса почти наверняка будет лежать где-то в исходной папке проекта.
  2. Те же функции для извлечения ресурса работают по-разному, если класс работает в плагине или в пакете непосредственно в рабочей области.

Следующий код даст нам все полезные пути:

    URL localPackage = this.getClass().getResource("");
    URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation();
    String localDir = localPackage.getPath();
    String loaderDir = urlLoader.getPath();
    System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);

Здесь исследуются обе функции, которые можно использовать для локализации папки ресурсов. Что касается class, его можно получить любым способом, статически или динамически.


Если проекта нет в плагине, код, запущенный в JUnit, выведет:

loaderDir = /C:.../ws/source.dir/target/test-classes/
 localDir = /C:.../ws/source.dir/target/test-classes/package/

Итак, чтобы попасть в src/rest/resources, нам нужно пройти вверх и вниз по дереву файлов. Оба метода могут быть использованы. Обратите внимание, мы не можем использовать getResource(resourceFolderName), поскольку эта папка не находится в целевой папке. Надеюсь, никто не вкладывает ресурсы в созданные папки.


Если класс находится в пакете, который находится в плагине, результат того же теста будет:

loaderDir = /C:.../ws/plugin/bin/
 localDir = /C:.../ws/plugin/bin/package/

Итак, снова мы должны идти вверх и вниз по дереву папок.


Наиболее интересным является случай, когда пакет запускается в плагине. Как тест плагинов JUnit, для нашего примера. Выход:

loaderDir = /C:.../ws/plugin/
 localDir = /package/

Здесь мы можем получить абсолютный путь, только объединяя результаты обеих функций. И этого мало. Между ними мы должны указать локальный путь к месту, где находятся пакеты классов, относительно папки плагина. Возможно, вам придется вставить что-то как src или src/test/resource здесь.

Вы можете вставить код в свой и увидеть пути, которые у вас есть.