Предположим, что стандартная настройка maven.
Скажите в папке ресурсов, что у вас есть файл abc
.
В Java, как я могу получить абсолютный путь к файлу, пожалуйста?
Предположим, что стандартная настройка maven.
Скажите в папке ресурсов, что у вас есть файл abc
.
В Java, как я могу получить абсолютный путь к файлу, пожалуйста?
Вы можете использовать метод 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();
Правильный способ работы:
URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();
Теперь не имеет значения, где физически находится файл в пути к классам, он будет найден до тех пор, пока ресурс фактически является файлом, а не записью JAR.
(Казалось, очевидный new File(resource.getPath())
не работает для всех путей! Путь по-прежнему кодируется URL-адресом!)
Необходимо указать путь, начинающийся с /
URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();
Создайте экземпляр classLoader нужного вам класса, тогда вы сможете легко получить доступ к файлам или ресурсам. Теперь вы getPath()
доступ к пути, используя getPath()
этого класса.
ClassLoader classLoader = getClass().getClassLoader();
String path = classLoader.getResource("chromedriver.exe").getPath();
System.out.println(path);
Чтобы вернуть файл или путь к файлу
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
На пути к абсолютному пути есть две проблемы:
Следующий код даст нам все полезные пути:
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
здесь.
Вы можете вставить код в свой и увидеть пути, которые у вас есть.