Как прочитать каталог из класса пути выполнения?

Мое приложение Java должно быть в состоянии найти каталог myconfig/, который будет связан внутри одного JAR:

myjar.jar/
    com/
        me/
            myproject/
                ConfigLoader.java --> looks for myconfig/ directory and its contents
    myconfig/
        conf-1.xml
        conf.properties
        ... etc.

Как я действительно читаю эту директорию myconfig/ вне класса времени выполнения? Я провел некоторое исследование, и кажется, что обычный метод чтения файла из пути к классам не работает для каталогов:

InputStream stream = ConfigLoader.class.getResourceAsStream("myconfig");

Знает ли кто-нибудь, как читать весь каталог из пути к среде выполнения (в отличие от одного файла)? Спасибо заранее!

Обратите внимание: невозможно загрузить файлы по отдельности, myconfig - это каталог с тысячами файлов свойств внутри него.

Ответ 1

Вы можете использовать PathMatchingResourcePatternResolver, предоставленный Spring.

public class SpringResourceLoader {

    public static void main(String[] args) throws IOException {
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

        // Ant-style path matching
        Resource[] resources = resolver.getResources("/myconfig/**");

        for (Resource resource : resources) {
            InputStream is = resource.getInputStream();
            ...
        }
    }
}

Мне не понравилось возвращенное Resource, но вы получили изображение.

Добавьте это в свою зависимость от maven (при использовании maven):

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>3.1.2.RELEASE</version>
</dependency>

Ответ 2

Вы можете вызвать ClassLoader.getResource(), чтобы найти конкретный файл в каталоге (или сам каталог, если getResource() вернет каталоги). getResource() возвращает URL-адрес, указывающий на результат. Затем вы можете преобразовать этот URL в любую форму, требуемую другой библиотекой.

Ответ 3

Хитрость заключается в том, что загрузчик классов может найти каталоги в пути к классам, а класс - нет.

Так что это работает

this.getClass().getClassLoader().getResource("com/example/foo/myconfig");

пока это не

this.getClass().getResource("myconfig");