Как правильно прописывать пути к ресурсам в Java?
Доброго всем дня. В данный момент изучаю java. Разработку веду в intellij idea.
Взялся реализовать простой справочник используя javafx. БД sqlite, для подключения maven подтягивает необходимые библиотеки. Все работает пока запускаешь из idea и перестает работать после сборки в jar. В процессе изучения понял что не тем собирал и с путями у меня полная неразбериха.
Потому вопрос — как правильно прописать пути к папке resources?
В idea когда создаешь maven project имеем следующую структуру
src --main ----java ------Main ----resources ------db --------test.db ------test.fxml --test pom.xml
Как правильно в Main прописать путь к test.fxml и к test.db?
На данный момент fxml (перенес его в корень к Main) получаю через
Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
Но по мне так не верно
- Вопрос задан более трёх лет назад
- 3973 просмотра
Чтение ресурсных файлов
Помимо конфигурационных файлов в приложении бывает удобно хранить и некоторые другие файлы ресурсов. Например, тексты или изображения. Достаточно положить эти файлы в папку resources вашего проекта и в процессе выполнения вы сможете получить к ним доступ.
Например, нам нужно прочитать файл test.txt. Положим его в папку resources вашего проекта (она есть и в maven, и в gradle). Важно положить именно в ту resources, которая относится к самому приложению, а не к тестам, иначе вы не сможете обратиться к файлу.
public class ResourceReader <
<>
public static void main(String[] args) throws Exception var example = new ResourceReader();
var content = example.readTextResource( «test.txt» );
System.out.println(content);
>
public String readTextResource(String filename) throws Exception var uri = getClass().getResource(String.format( «/%s» , filename)).toURI();
return Files.readString(Paths.get(uri));
>
>
Доступ к ресурсам мы получаем через метод getResource(), который имеется у объекта Class. Но доступ к классу из статичного контекста метода main() получить нельзя, поэтому мы сначала создаём экземпляр класса, а затем внутри него уже обращаемся к ресурсу. Обратите внимание, что имя ресурса начинается со слеша. Путь до ресурса указывается от корня папки resources. Для чтения содержимого файла целиком в строку используем метод Files.readString(), появившийся в Java 11. Если у вас более ранняя версия Java, то данный метод будет недоступен. В случае, если файл будет очень большим, также лучше данный метод не использовать, а читать файл с помощью буферизованного потока.
То же самое на kotlin:
fun main() <
val example = ResourceReader()
val content = example.readTextResource( «test.txt» )
println(content)
>
class ResourceReader fun readTextResource(filename: String): String val uri = this .javaClass.getResource( «/$filename» ).toURI()
return Files.readString(Paths.get(uri))
>
>
Ожидаемо, что код на kotlin более компактный.
Как указать путь к файлу в java
Чтобы указать путь к файлу в Java , можно использовать класс java.io.File . Существует несколько способов задания пути:
File file = new File("/path/to/file.txt"); // Здесь /path/to/file.txt - абсолютный путь к файлу.
Относительный путь от текущего каталога:
File file = new File("file.txt"); // Здесь file.txt - файл, расположенный в текущем каталоге.
Относительный путь от корня проекта:
File file = new File("src/main/resources/file.txt");
Пути к ресурсам
Однако, если создать jar, то программа эти папки не находит. Какой путь надо указать, чтобы программа считала эти файлы при переносе jar-файла на другой компьютер (естественно, папка Resources переносится вместе с jar)? Включать папку в сам проект не нужно, там могут быть разные файлы.
Отслеживать
задан 13 мар 2019 в 10:09
Александр Дорофеев Александр Дорофеев
3 2 2 бронзовых знака
13 мар 2019 в 10:24
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вот так вы можете это сделать универсально, для файла который лежит рядом с jar:
InputStream is = getClass().getClassLoader().getResouceAsStram("./file.txt");
вот при таком размещении файлов
./ |__ *.jar |__ file.txt
Отслеживать
ответ дан 13 мар 2019 в 10:21
Stranger in the Q Stranger in the Q
56k 10 10 золотых знаков 83 83 серебряных знака 136 136 бронзовых знаков
Помогло вот это: File fileRoot = new File(System.getProperty(«user.dir»)+»\\Resources»);
13 мар 2019 в 18:25
- java
- jar
-
Важное на Мете
Связанные
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.