Я хотел бы узнать, как лучше всего загрузить ресурс на Java:
this.getClass().getResource() (or getResourceAsStream())
,Thread.currentThread().getContextClassLoader().getResource(name)
,System.class.getResource(name)
.
Разработайте решение в соответствии с тем, что вы хотите ...
Есть две вещи, которые getResource
/ getResourceAsStream()
получит от класса, для которого он вызван ...
Итак, если вы это сделаете
this.getClass().getResource("foo.txt");
он попытается загрузить файл foo.txt из того же пакета, что и класс this, и с помощью загрузчика классов этого класса. Если вы поставите перед ним «/», то вы полностью ссылаетесь на ресурс.
this.getClass().getResource("/x/y/z/foo.txt")
загрузит ресурс из загрузчика классов «this» и из пакета xyz (он должен находиться в том же каталоге, что и классы в этом пакете).
Thread.currentThread().getContextClassLoader().getResource(name)
загрузится с помощью загрузчика класса контекста, но не разрешит имя в соответствии с каким-либо пакетом (на него должна быть абсолютная ссылка)
System.class.getResource(name)
Загрузит ресурс с помощью загрузчика системного класса (на него также должна быть абсолютная ссылка, так как вы не сможете ничего поместить в пакет java.lang (пакет System).
Просто взгляните на источник. Также указывает, что getResourceAsStream просто вызывает «openStream» для URL, возвращенного из getResource, и возвращает его.
Thread#setContextClassLoader
. Это полезно, если вам нужно изменить путь к классам во время выполнения программы.Что ж, отчасти это зависит от того, что вы хотите, если вы на самом деле находитесь в производном классе.
Например, предположим, что он
SuperClass
находится в A.jar иSubClass
находится в B.jar, и вы выполняете код в методе экземпляра, объявленном в,SuperClass
но гдеthis
ссылается на экземплярSubClass
. Если выthis.getClass().getResource()
его используете, он будет выглядеть относительноSubClass
, в B.jar. Я подозреваю, что обычно этого не требуется.Лично я, вероятно, использовал бы
Foo.class.getResourceAsStream(name)
чаще всего - если вы уже знаете имя ресурса, который вам нужен, и вы уверены, где оно относительноFoo
, это самый надежный способ сделать это, ИМО.Конечно, бывают случаи, когда вы тоже этого не хотите: судите каждое дело по существу. Просто «Я знаю, что этот ресурс связан с этим классом» - самый распространенный вопрос, с которым я сталкивался.
источник
this.getClass()
. Создайте экземпляр подкласса и вызовите метод ... он распечатает имя подкласса, а не суперкласса.Я ищу в трех местах, как показано ниже. Комментарии приветствуются.
источник
Я знаю, что уже поздно для другого ответа, но я просто хотел поделиться тем, что помогло мне в конце. Он также будет загружать ресурсы / файлы из абсолютного пути файловой системы (а не только из пути к классам).
источник
Я пробовал много способов и функций, которые предлагались выше, но они не работали в моем проекте. В любом случае я нашел решение, и вот оно:
источник
this.getClass().getResourceAsStream()
в этом случае. Если вы посмотрите на источникgetResourceAsStream
метода, вы заметите, что он делает то же самое, что и вы, но более разумным способом (откат, если его нет,ClassLoader
можно найти в классе). Это также указывает на то, что вы можете столкнуться с потенциаломnull
наgetClassLoader
в вашем коде ...this.getClass().getResourceAsStream()
, у меня не работает, поэтому я использую это работает. Я думаю, что есть люди, которые могут столкнуться с такой проблемой, как моя.