Как 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 внутри папки пакета проекта.

Другие вопросы по тегам