Estoy buscando una manera de obtener una lista de todos los nombres de recursos de un directorio classpath dado, algo así como un método List<String> getResourceNames (String directoryName)
.
Por ejemplo, dado un directorio de ruta de clases x/y/z
que contiene archivos a.html
, b.html
, c.html
y un subdirectorio d
, getResourceNames("x/y/z")
debe devolver una List<String>
que contiene las siguientes cadenas: ['a.html', 'b.html', 'c.html', 'd']
.
Debería funcionar tanto para recursos en el sistema de archivos como en frascos.
Sé que puedo escribir un fragmento rápido con File
s, JarFile
sy URL
s, pero no quiero reinventar la rueda. Mi pregunta es, dadas las bibliotecas disponibles públicamente, ¿cuál es la forma más rápida de implementar getResourceNames
? Las pilas Spring y Apache Commons son factibles.
Respuestas:
Escáner personalizado
Implemente su propio escáner. Por ejemplo:
Spring Framework
Uso
PathMatchingResourcePatternResolver
de Spring Framework.Reflexiones de Ronmamo
Las otras técnicas pueden ser lentas en tiempo de ejecución para grandes valores de CLASSPATH. Una solución más rápida es utilizar la API Reflections de ronmamo , que precompila la búsqueda en el momento de la compilación.
fuente
new Reflections("my.package", new ResourcesScanner()).getResources(pattern)
getResourceAsStream()
con una ruta relativa a un directorio conduce a un FileInputStream (File), que se define para lanzar FileNotFoundException si el archivo es un directorio.Aquí está el código
Fuente : forums.devx.com/showthread.php?t=153784
Si está utilizando Spring Eche un vistazo a PathMatchingResourcePatternResolver
fuente
File.pathSeparator
en vez del disco con código:
degetResources
método.final String[] classPathElements = classPath.split(System.pathSeparator);
Usando reflexiones
Obtén todo en el classpath:
Otro ejemplo: obtenga todos los archivos con extensión .csv de some.package :
fuente
Si usa apache commonsIO, puede usarlo para el sistema de archivos (opcionalmente con filtro de extensión):
y para recursos / classpath:
Si no sabe si "directoy /" está en el sistema de archivos o en los recursos, puede agregar un
o
antes de las llamadas y usar ambos en combinación ...
fuente
Entonces, en términos de PathMatchingResourcePatternResolver, esto es lo que se necesita en el código:
fuente
classpath*:config/*.xml
El
Spring framework
'sPathMatchingResourcePatternResolver
es realmente increíble para estas cosas:Dependencia de Maven:
fuente
Usó una combinación de la respuesta de Rob.
fuente
/' or
. 'o./
ninguno de los cuales realmente funcionóCon Spring es fácil. Ya sea un archivo o carpeta, o incluso varios archivos, hay posibilidades de que pueda hacerlo mediante inyección.
Este ejemplo demuestra la inyección de múltiples archivos ubicados en la
x/y/z
carpeta.Funciona para recursos en el sistema de archivos, así como en JAR.
fuente
Esto debería funcionar (si la primavera no es una opción):
fuente
Mi manera, no Spring, utilizada durante una prueba unitaria:
fuente
El mecanismo más robusto para enumerar todos los recursos en el classpath es utilizar este patrón con ClassGraph , ya que maneja la gama más amplia posible de mecanismos de especificación de classpath , incluido el nuevo sistema de módulos JPMS. (Soy el autor de ClassGraph).
fuente
Creo que puede aprovechar el [ Proveedor del sistema de archivos Zip ] [1] para lograr esto. Cuando se usa
FileSystems.newFileSystem
parece que puede tratar los objetos en ese ZIP como un archivo "normal".En la documentación vinculada arriba:
La documentación para el
jdk.zipfs
módulo en [Java 11 estados] [5]:Aquí hay un ejemplo artificial que hice usando sus recursos de ejemplo. Tenga en cuenta que a
.zip
es a.jar
, pero podría adaptar su código para utilizar recursos classpath:Preparar
Java
Salida
fuente
Ninguna de las respuestas funcionó para mí, aunque mis recursos se pusieron en carpetas de recursos y seguí las respuestas anteriores. Lo que hizo un truco fue:
fuente
Basado en la información de @rob anterior, creé la implementación que estoy lanzando al dominio público:
Si bien no hubiera esperado
getResourcesAsStream
trabajar así en un directorio, realmente funciona y funciona bien.fuente