Skip to content
Aleksandr Kuchuk edited this page Aug 4, 2016 · 4 revisions

Введение

Часто бывает нужно использовать какие-то ресурсы в работе вашего приложения. Например, вы хотите использовать какую-то картинку, внешний файл с данными и т.д

Как же быть? Есть несколько возможных вариантов:

  • Использование абсолютного пути на диске
  • Использование java.lang.Class-методов, таких как getResourceAsStream, getResource и т.д

Первый способ - очень плох и годится лишь для тестовых вещей, сделанных на коленке.

Работаем с ресурсами правильно

Как видно, методы getResource(String) и getResourceAsStream(String) ждут от нас какой-то строки. Эта строка - имя ресурса - это путь к ресурсу и его имя.

Кажется все просто, но тут есть небольшой подводный камень, а именно, что имя ресурса можно по разному интерпретировать.

Итак:

  • Абсолютное имя, начинается с символа '/'
  • Относительное имя

В чем же разница? А в том, что в первом случае ресурс мы ищем относительно корня classpath, а во втором - к имени ресурса приписывается еще и имя пакета, в котором находится текущий класс.

Т.е пусть у нас есть класс Example, находящийся в пакете com.github.aarexer и мы имеем ресурс test.txt, тогда

Example.class.getResource("/test.txt")

Мы будем искать по classpath/test.txt, а если:

Example.class.getResource("test.txt")

Будет classpath/com/github/aarexer/test.txt

Где classpath - это ваш заданный classpath.

Два примера использования: Resources example

//todo issue

Работа с jar

Помните, что если вы читаете ресурс из jar и используете '/', то необходимо использовать:

getResourceAsStream(...);

Иначе вы получите java.lang.IllegalArgumentException

Clone this wiki locally