Перейти к содержимому

Java как указать путь к файлу из resources

  • автор:

Как правильно прописывать пути к ресурсам в 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *