-
Notifications
You must be signed in to change notification settings - Fork 3
Resources
Часто бывает нужно использовать какие-то ресурсы в работе вашего приложения. Например, вы хотите использовать какую-то картинку, внешний файл с данными и т.д
Как же быть? Есть несколько возможных вариантов:
- Использование абсолютного пути на диске
- Использование
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 и используете '/', то необходимо использовать:
getResourceAsStream(...);
Иначе вы получите java.lang.IllegalArgumentException