Интересно какая разница между Class.getResource()
а ClassLoader.getResource()
?
редактировать: я особенно хочу знать, если какое-либо кэширование на уровне файлов / каталогов. Как в "кэшируются ли списки каталогов в версии класса?"
AFAIK следующие должны по существу делать то же самое, но это не так:
getClass().getResource()
getClass().getClassLoader().getResource()
Я обнаружил это, когда возился с кодом генерации отчетов, который создает новый файл WEB-INF/classes/
из существующего файла в этом каталоге. При использовании метода из класса я мог найти файлы, которые были там при развертывании getClass().getResource()
, но при попытке извлечь только что созданный файл я получил нулевой объект. Просмотр каталога ясно показывает, что новый файл есть. К именам файлов добавляется косая черта, как в "/myFile.txt".
ClassLoader
Версия getResource()
с другой стороны нашла сгенерированный файл. Из этого опыта кажется, что происходит какое-то кэширование списка каталогов. Я прав, и если да, то где это задокументировано?
Из документов API наClass.getResource()
Находит ресурс с заданным именем. Правила поиска ресурсов, связанных с данным классом, реализуются загрузчиком класса, определяющего класс. Этот метод делегирует загрузчику классов этого объекта. Если этот объект был загружен загрузчиком класса начальной загрузки, метод делегируется ClassLoader.getSystemResource (java.lang.String).
Для меня это звучит так: «Class.getResource действительно вызывает свой собственный загрузчик классов getResource ()». Что было бы так же, как делать getClass().getClassLoader().getResource()
. Но это явно не так. Может ли кто-нибудь дать мне некоторое представление об этом?
источник
Class.getResource
может принимать «относительное» имя ресурса, которое обрабатывается относительно пакета класса. В качестве альтернативы вы можете указать «абсолютное» имя ресурса, используя начальный слеш. Пути к ресурсам загрузчика классов всегда считаются абсолютными.Таким образом, следующие в основном эквивалентны:
И вот они (но они отличаются от вышеупомянутого):
источник
this.getClass().getClassLoader().getResource("/");
возвращать ноль ? Это не должно быть так же, какthis.getClass().getClassLoader().getResource(".");
Первый вызов выполняет поиск относительно
.class
файла, а последний - относительно корня пути к классам.Для устранения подобных проблем я печатаю URL:
источник
getClassLoader().getResource("/...")
всегда возвращаетсяnull
- загрузчик классов не удаляет ведущий/
из пути, поэтому поиск всегда дает сбой. ТолькоgetClass().getResource()
обрабатывает начало/
как абсолютный путь относительно пути к классам.Пришлось посмотреть это в спецификации:
Class.getResource (строковый ресурс)
ClassLoader.getResource (строковый ресурс)
Класс getResource () - документация утверждает разницу:
источник
Все эти ответы здесь, а также ответы в этом вопросе предполагают, что загрузка абсолютных URL-адресов, таких как "/foo/bar.properties", обрабатывается одинаково с помощью
class.getResourceAsStream(String)
иclass.getClassLoader().getResourceAsStream(String)
. Это НЕ так, по крайней мере, в моей конфигурации / версии Tomcat (в настоящее время 7.0.40).Извините, у меня нет абсолютно никакого удовлетворительного объяснения, но я предполагаю, что tomcat делает грязные трюки и свою черную магию с загрузчиками классов и вызывает разницу. Я всегда использовал
class.getResourceAsStream(String)
в прошлом и не было никаких проблем.PS: я также разместил это здесь
источник
Class.getResources
будет получать ресурс загрузчиком классов, который загружает объект. ХотяClassLoader.getResource
бы получить ресурс, используя указанный загрузчик классов.источник
Я попытался прочитать из input1.txt, который был внутри одного из моих пакетов, вместе с классом, который пытался его прочитать.
Следующие работы:
Самой важной частью было позвонить,
getPath()
если вы хотите правильный путь в формате String. НЕ ИСПОЛЬЗУЙtoString()
потому что это добавит некоторый дополнительный форматирующий текст, который ПОЛНОСТЬЮ НЕПРАВИЛЬНО ИСПОЛЬЗУЕТ fileName (вы можете попробовать его и посмотреть распечатку).Потратил 2 часа на отладку этого ... :(
источник
FileReader
илиFileInputStream
не могут быть использованы для доступа к ним. Ответ не верный.