getresourceasstream - load file from classpath java
¿Cómo usar ClassLoader.getResources() correctamente? (5)
Aquí hay un código basado en la respuesta de bestsss:
Enumeration<URL> en = getClass().getClassLoader().getResources(
"META-INF");
List<String> profiles = new ArrayList<>();
if (en.hasMoreElements()) {
URL url = en.nextElement();
JarURLConnection urlcon = (JarURLConnection) (url.openConnection());
try (JarFile jar = urlcon.getJarFile();) {
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
String entry = entries.nextElement().getName();
System.out.println(entry);
}
}
}
Esta pregunta ya tiene una respuesta aquí:
¿Cómo puedo usar ClassLoader.getResources()
para encontrar recursos recursivos de mi classpath?
P.ej
Encontrar todos los recursos en el "directorio" de
META-INF
: imagina algo así comogetClass().getClassLoader().getResources("META-INF")
Desafortunadamente, esto solo recupera una
URL
exactamente a este "directorio".todos los recursos llamados
bla.xml
(recursivamente)getClass().getClassLoader().getResources("bla.xml")
Pero esto devuelve una
Enumeration
vacía.
Y como una pregunta adicional: ¿Cómo se diferencia ClassLoader.getResource()
de ClassLoader.getResource()
?
Este es el valor más simple para obtener el objeto File al que apunta un determinado objeto URL:
File file=new File(url.toURI());
Ahora, para sus preguntas concretas:
- encontrar todos los recursos en el "directorio" de META-INF:
De hecho, puede obtener el objeto File que apunta a esta URL
Enumeration<URL> en=getClass().getClassLoader().getResources("META-INF");
if (en.hasMoreElements()) {
URL metaInf=en.nextElement();
File fileMetaInf=new File(metaInf.toURI());
File[] files=fileMetaInf.listFiles();
//or
String[] filenames=fileMetaInf.list();
}
- todos los recursos llamados bla.xml (recursivamente)
En este caso, tendrá que hacer un código personalizado. Aquí hay un ejemplo ficticio:
final List<File> foundFiles=new ArrayList<File>();
FileFilter customFilter=new FileFilter() {
@Override
public boolean accept(File pathname) {
if(pathname.isDirectory()) {
pathname.listFiles(this);
}
if(pathname.getName().endsWith("bla.xml")) {
foundFiles.add(pathname);
return true;
}
return false;
}
};
//rootFolder here represents a File Object pointing the root forlder of your search
rootFolder.listFiles(customFilter);
Cuando se ejecuta el código, obtendrá todas las ocurrencias encontradas en la lista foundFiles
.
MRalwasser, te diría una pista, lanza el URL.getConnection()
a JarURLConnection
. Luego use JarURLConnection.getJarFile () y ¡listo! Usted tiene JarFile y puede acceder a los recursos internos.
El resto te dejo.
¡Espero que esto ayude!
No hay forma de buscar recursivamente a través del classpath. Necesita saber la ruta de acceso completa de un recurso para poder recuperarlo de esta manera. El recurso puede estar en un directorio en el sistema de archivos o en un archivo jar, por lo que no es tan simple como realizar una lista de directorios de "classpath". Tendrá que proporcionar la ruta completa del recurso, por ejemplo ''/com/mypath/bla.xml''.
Para su segunda pregunta, getResource devolverá el primer recurso que coincida con el nombre del recurso dado. El orden en el que se busca la ruta de clases se proporciona en javadoc para getResource.
Spring Framework tiene una clase que permite realizar búsquedas recursivas a través del classpath:
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
resolver.getResources("classpath*:some/package/name/**/*.xml");