Предположим стандартную настройку 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();
target/classes/abc.txt
ссылку на файл, поскольку это каноническое место, куда Maven помещает файлы ресурсов после обработки (например, плагин maven-resources мог выполнить подстановку свойств в abc.txt). Намного лучше использовать abc.txt через getResource () из пути к классам.
Правильный способ, который действительно работает:
URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();
Теперь не имеет значения, где физически находится файл в пути к классам, он будет найден, если ресурс на самом деле является файлом, а не записью JAR.
(Кажущееся очевидным new File(resource.getPath())
не работает для всех путей! Путь все еще закодирован в URL!)
new File(resource.toURI()).getAbsolutePath();
(т.е. я не думаю, что вам нужен объект Path?)
new File(YourClass.class.getResource("abc").toURI().getPath())
если бы захотели.
.getResource("/abc")
Создайте экземпляр classLoader нужного вам класса, тогда вы сможете легко получить доступ к файлам или ресурсам. теперь вы получаете доступ к пути, используя 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
сюда.
Вы можете вставить код в свой и увидеть имеющиеся у вас пути.