Загрузка ресурса Java [дубликат]

Это просто дополнительная информация ... Рассмотрим список ниже

>>> l=[12,23,345,456,67,7,945,467]

Несколько других трюков для изменения списка:

>>> l[len(l):-len(l)-1:-1]
[467, 945, 7, 67, 456, 345, 23, 12]

>>> l[:-len(l)-1:-1]
[467, 945, 7, 67, 456, 345, 23, 12]

>>> l[len(l)::-1]
[467, 945, 7, 67, 456, 345, 23, 12]

>>> l[::-1]
[467, 945, 7, 67, 456, 345, 23, 12]

>>> l[-1:-len(l)-1:-1]
[467, 945, 7, 67, 456, 345, 23, 12]

См. ответ abc выше

158
задан S.L. Barth 25 July 2012 в 14:47
поделиться

7 ответов

Чтобы ответить на вопрос, происходит ли какое-либо кеширование.

Я исследовал этот вопрос дальше, запустив автономное приложение Java, которое непрерывно загружало файл с диска с помощью метода getResourceAsStream ClassLoader. Я смог отредактировать файл, и изменения были немедленно отображены, т. Е. Файл был перезагружен с диска без кеширования.

Однако: Я работаю над проектом с несколькими модулями maven и веб-проектами, которые имеют зависимости друг от друга. Я использую IntelliJ в качестве моей IDE для компиляции и запуска веб-проектов.

Я заметил, что вышеизложенное, похоже, уже не верно, причина в том, что файл, который я загружал, теперь запекается в банку и развертывается в зависимости от веб-проекта. Я заметил это только после попытки изменить файл в моей целевой папке, но безрезультатно. Это заставило похоже, что происходит кеширование.

3
ответ дан mchlstckl 26 August 2018 в 21:42
поделиться

Class.getResource может принимать «относительное» имя ресурса, которое обрабатывается относительно пакета класса. В качестве альтернативы вы можете указать «абсолютное» имя ресурса, используя ведущую косую черту. Пути ресурсов Resourceload всегда считаются абсолютными.

Итак, следующие в основном эквивалентны:

foo.bar.Baz.class.getResource("xyz.txt");
foo.bar.Baz.class.getClassLoader().getResource("foo/bar/xyz.txt");

И так они (но они отличаются от выше):

foo.bar.Baz.class.getResource("/data/xyz.txt");
foo.bar.Baz.class.getClassLoader().getResource("data/xyz.txt");
194
ответ дан Derek Mahar 26 August 2018 в 21:42
поделиться

Все эти ответы здесь, а также ответы в на этот вопрос показывают, что загрузка абсолютных URL-адресов, таких как «/foo/bar.properties», обрабатывалась одинаково с помощью class.getResourceAsStream(String) и class.getClassLoader().getResourceAsStream(String). Это не так, по крайней мере, не в моей конфигурации / версии Tomcat (в настоящее время 7.0.40).

MyClass.class.getResourceAsStream("/foo/bar.properties"); // works!  
MyClass.class.getClassLoader().getResourceAsStream("/foo/bar.properties"); // does NOT work!

Извините, у меня нет абсолютно никакого объяснения, но я думаю, что tomcat делает грязные трюки и его черную магию с загрузчиками классов и вызывают разницу. Я всегда использовал class.getResourceAsStream(String) в прошлом и не имел никаких проблем.

PS: Я также разместил это над здесь

9
ответ дан Community 26 August 2018 в 21:42
поделиться

Первый вызов выполняет поиск по отношению к файлу .class, в то время как последний ищет по отношению к корню classpath.

Чтобы отлаживать такие проблемы, я печатаю URL:

System.out.println( getClass().getResource(getClass().getSimpleName() + ".class") );
18
ответ дан Dave Jarvis 26 August 2018 в 21:42
поделиться

Я попытался прочитать из input1.txt, который находился внутри одного из моих пакетов вместе с классом, который пытался его прочитать.

Следующие работы:

String fileName = FileTransferClient.class.getResource("input1.txt").getPath();

System.out.println(fileName);

BufferedReader bufferedTextIn = new BufferedReader(new FileReader(fileName));

Наиболее важной частью было называть getPath(), если вы хотите указать правильный путь в формате String. НЕ ИСПОЛЬЗУЙТЕ toString(), потому что он добавит дополнительный текст форматирования, который будет ОБРАТИТЬСЯ к файлуName (вы можете попробовать его и посмотреть распечатку).

Отработано 2 часа отладки этого ... :(

0
ответ дан Kevin Lee 26 August 2018 в 21:42
поделиться

Class.getResources извлекает ресурс загрузчиком классов, который загружает объект. В то время как ClassLoader.getResource будет извлекать ресурс, используя указанный загрузчик классов.

1
ответ дан lwpro2 26 August 2018 в 21:42
поделиться

Пришлось посмотреть в спецификациях:

Класс getResource () - документация указывает на разницу:

Этот метод делегирует вызов его загрузчику классов после создания эти изменения в имени ресурса: если имя ресурса начинается с «/», оно не изменяется; в противном случае имя пакета добавляется к имени ресурса после преобразования «.». на "/". Если этот объект был загружен загрузчиком загрузки, вызов делегируется ClassLoader.getSystemResource.

14
ответ дан mrk 26 August 2018 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: