Как getClassLoader(). GetResourceAsStream() работает в Java
Я Google, как ниже код загружает ресурс Abc.class.getClassLoader(). GetResourceAsStream("abc.txt")
и найдите, что он ищет ресурс во всех файлах jar и zip в пути к классам.
Но когда я попробовал это, я не в состоянии загрузить это, но если я даю путь пакета, то я могу загрузить это, кто-то может сказать мне, как getResourceAsStream ищет путь к классу
Спасибо
Один из сценариев:- Мой код ниже - простая программа, а мой файл ресурсов abc.txt находится в пакете com.abc. когда я указываю путь к пакету, он работает, а когда нет, он не работает.
package com.abc;
public class ResourceExp {
public static void main(String args[])
{
new ResourceExp().getResource();
}
public void getResource()
{
String name = "abc.txt";
// worked
System.out.println(ResourceExp.class.getClassLoader().getResourceAsStream("com/abc/"+name));
//not workded
//System.out.println(ResourceExp.class.getClassLoader().getResourceAsStream(name));
}
}
если getResourceAsStream просматривает ресурс во всех файлах и каталогах jar, то почему я должен указать путь к пакету
2 ответа
Я гуглю, как приведенный ниже код загружает ресурс Abc.class.getClassLoader(). GetResourceAsStream("abc.txt") и обнаруживаю, что он ищет ресурс во всех jar-файлах и zip-файлах в пути к классам.
Это правильно, когда вы работаете только с одним ClassLoader (большинство не-OSGi/ немодульных сред). Тогда все содержимое всех JAR-файлов можно рассматривать как одно большое дерево, в котором классы и ресурсы JAR-файлов, которые встречаются ранее в пути классов, выигрывают над теми JARS-файлами, которые происходят дальше.
Но когда я попробовал это, я не в состоянии загрузить это, но если я даю путь пакета, то я могу загрузить это, кто-то может сказать мне, как getResourceAsStream ищет путь к классу
Abc.class.getClassLoader().getResourceAsStream("abc.txt")
ищет в корне дерева, пока:
Abc.class.getResourceAsStream("abc.txt")
поиски относительно пакета Abc.
Abc.class.getResourceAsStream("/abc.txt")
снова ищет корень дерева.
Все эти методы будут искать только в указанном каталоге (или в корневом каталоге) и не будут проходить и выполнять поиск по всему дереву.
Лично я обычно всегда использую последние две версии (Class.getResourceAsStream
) и редко пользуюсь ClassLoader.getResourceAsStream
метод напрямую.
Например, вы можете создать исходную папку"resources", поместить в нее файлы, а затем использовать Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.txt");
Я всегда использую этот метод.
Я использовал это:
InputStream file = YOURCLASSNAME.class.getClassLoader().getResourceAsStream("app.properties");
Если я использую это, он не показывает файл, который не найден, и не читает точный файл с нашим любым путем, но вы должны поместить свой файл app.properties в main/resources внутри папки пакета проекта.