Это просто дополнительная информация ... Рассмотрим список ниже
>>> 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 выше
Чтобы ответить на вопрос, происходит ли какое-либо кеширование.
Я исследовал этот вопрос дальше, запустив автономное приложение Java, которое непрерывно загружало файл с диска с помощью метода getResourceAsStream ClassLoader. Я смог отредактировать файл, и изменения были немедленно отображены, т. Е. Файл был перезагружен с диска без кеширования.
Однако: Я работаю над проектом с несколькими модулями maven и веб-проектами, которые имеют зависимости друг от друга. Я использую IntelliJ в качестве моей IDE для компиляции и запуска веб-проектов.
Я заметил, что вышеизложенное, похоже, уже не верно, причина в том, что файл, который я загружал, теперь запекается в банку и развертывается в зависимости от веб-проекта. Я заметил это только после попытки изменить файл в моей целевой папке, но безрезультатно. Это заставило похоже, что происходит кеширование.
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");
Все эти ответы здесь, а также ответы в на этот вопрос показывают, что загрузка абсолютных 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: Я также разместил это над здесь
Первый вызов выполняет поиск по отношению к файлу .class
, в то время как последний ищет по отношению к корню classpath.
Чтобы отлаживать такие проблемы, я печатаю URL:
System.out.println( getClass().getResource(getClass().getSimpleName() + ".class") );
Я попытался прочитать из 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 часа отладки этого ... :(
Class.getResources извлекает ресурс загрузчиком классов, который загружает объект. В то время как ClassLoader.getResource будет извлекать ресурс, используя указанный загрузчик классов.
Пришлось посмотреть в спецификациях:
Класс getResource () - документация указывает на разницу:
Этот метод делегирует вызов его загрузчику классов после создания эти изменения в имени ресурса: если имя ресурса начинается с «/», оно не изменяется; в противном случае имя пакета добавляется к имени ресурса после преобразования «.». на "/". Если этот объект был загружен загрузчиком загрузки, вызов делегируется ClassLoader.getSystemResource.
blockquote>