Я ищу способ получить список всех имен ресурсов из заданного каталога classpath, что-то вроде метода List<String> getResourceNames (String directoryName)
.
Например, если каталог путь к классам , x/y/z
содержащий файлы a.html
, b.html
, c.html
и подкаталог d
, getResourceNames("x/y/z")
должны возвращать , List<String>
содержащий следующие строки: ['a.html', 'b.html', 'c.html', 'd']
.
Он должен работать как для ресурсов в файловой системе, так и для jars.
Я знаю, что могу написать быстрый фрагмент с File
s, JarFile
s и URL
s, но я не хочу изобретать велосипед. Мой вопрос, учитывая существующие общедоступные библиотеки, какой самый быстрый способ реализовать getResourceNames
? Стеки Spring и Apache Commons возможны.
Ответы:
Пользовательский сканер
Реализуйте свой собственный сканер. Например:
Spring Framework
Используйте
PathMatchingResourcePatternResolver
из Spring Framework.Ронмамо Размышления
Другие методы могут быть медленными во время выполнения для огромных значений CLASSPATH. Более быстрое решение - использовать Reflections API ronmamo , который прекомпилирует поиск во время компиляции.
источник
new Reflections("my.package", new ResourcesScanner()).getResources(pattern)
getResourceAsStream()
с относительным путем к каталогу приводит к FileInputStream (File), который определен как исключение FileNotFoundException, если файл является каталогом.Вот код
источника : forums.devx.com/showthread.php?t=153784
Если вы используете Spring Посмотрите на PathMatchingResourcePatternResolver
источник
File.pathSeparator
вместо жестко закодированы:
вgetResources
методе.final String[] classPathElements = classPath.split(System.pathSeparator);
Использование отражений
Получите все на пути к классам:
Другой пример - получить все файлы с расширением .csv из some.package :
источник
Если вы используете apache commonsIO, вы можете использовать его для файловой системы (опционально с расширением фильтра):
и для ресурсов / classpath:
Если вы не знаете, находится ли «directoy /» в файловой системе или в ресурсах, вы можете добавить
или
до звонков и использовать как в комбинации ...
источник
Так что с точки зрения PathMatchingResourcePatternResolver это то, что нужно в коде:
источник
classpath*:config/*.xml
В
Spring framework
«sPathMatchingResourcePatternResolver
действительно удивительный для этих вещей:Maven зависимость:
источник
Использовал комбинацию ответа Роба.
источник
/' or
.` или./
ни один из которых на самом деле не работалС весной это легко. Будь то файл, папка или даже несколько файлов, есть вероятность, что вы можете сделать это с помощью инъекции.
Этот пример демонстрирует внедрение нескольких файлов, расположенных в
x/y/z
папке.Это работает для ресурсов в файловой системе, а также в JAR.
источник
Это должно работать (если весна не вариант):
источник
По-моему, Spring не использовался во время юнит-теста:
источник
Самый надежный механизм для перечисления всех ресурсов в пути к классам в настоящее время - использовать этот шаблон с ClassGraph , поскольку он обрабатывает максимально широкий массив механизмов спецификации пути к классам , включая новую систему модулей JPMS. (Я автор ClassGraph.)
источник
Я думаю, что вы можете использовать [ Zip File System Provider ] [1] для достижения этой цели. Когда используешь
FileSystems.newFileSystem
он выглядит так, как будто вы можете рассматривать объекты в этом ZIP как «обычный» файл.В связанной документации выше:
Документация для
jdk.zipfs
модуля в [состояниях Java 11] [5]:Вот надуманный пример, который я сделал, используя ваши примеры ресурсов. Обратите внимание, что
.zip
это.jar
, но вы можете адаптировать свой код, чтобы вместо этого использовать ресурсы classpath:Настроить
Ява
Вывод
источник
Ни один из ответов не работал для меня, хотя мои ресурсы были помещены в папки ресурсов и следовали приведенным выше ответам. Что сделало трюк было:
источник
Основываясь на информации @rob выше, я создал реализацию, которую я публикую в открытом доступе:
Хотя я не ожидал, что так
getResourcesAsStream
будет работать с каталогом, он действительно работает и работает хорошо.источник