Как прочитать каталог из класса пути выполнения?
Мое приложение 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");