2010-06-02 10 views
5

Estoy familiarizado con la obtención del contenido de un archivo de propiedades dado el nombre del archivo, y obviamente MyClass.class.getResource ('*. Properties') no funcionará, pero ¿cómo puedo obtener una lista de TODOS los archivos de propiedades? ubicado en el mismo paquete que mi clase?¿Es posible cargar todos los archivos de propiedades contenidos en un paquete de forma dinámica? es decir, MyClass.class.getResource ('*. properties');

+0

Esto es fácil con la primavera, por lo que en la remota posibilidad de que se está usando, no puedo darle una respuesta basada en la primavera. – skaffman

+3

Ok ... entonces estoy empezando a pensar que esto no es posible. Desde mi punto de vista, Java usa la carga de clases lenta y, por lo tanto, el cargador de clases no sabe qué hay en un paquete hasta que se le pide que recupere una clase. Lo más parecido que se me ocurre es * intentar * resolver un nombre de paquete en el directorio, obtener una lista de prop. archivos en el directorio e intente cargarlos a través de class.getResource(). Sé que es un truco; hay una mejor manera? – Stoney

+0

Aha! Parece que funcionaría, cualquier respuesta que utilice Spring es bastante aceptable y sería muy apreciado – Stoney

Respuesta

6

Suponiendo que no está empaquetado en JAR, puede usar File#listFiles() para esto. He aquí un ejemplo patada de salida:

String path = MyClass.class.getResource("").getPath(); 
File[] propertiesFiles = new File(path).listFiles(new FilenameFilter() { 
    public boolean accept(File dir, String name) { 
     return name.endsWith(".properties"); 
    } 
}); 

Si se trata de JAR-envasados, entonces usted necesita un poco más de código, para empezar JarFile API. Puede encontrar otro ejemplo en this answer.

+0

Lo sentimos, no se permite el archivo. Actualmente la clase no está en un frasco ... pero no sé qué depara el futuro para mi clase y no tengo control sobre el entorno en el que se ejecutará, por lo que debe estar lo más desacoplado posible – Stoney

+0

Lo siento ... no tiene suficientes puntos para votar su respuesta todavía ... – Stoney

1

Ésta es la forma en que lo hice,

Class<? extends Object> clazz = AnyKnownClassInTheJar.class; 
String classFileName = clazz.getSimpleName() + ".class"; 
URL classResource = clazz.getResource(classFileName); 
if (!"jar".equals(classResource.getProtocol())) { 
    // Class not from JAR 
    return; 
} 
JarURLConnection classConnection = (JarURLConnection)classResource.openConnection(); 
JarFile jar = classConnection.getJarFile(); 
for (Enumeration<JarEntry> i = jar.entries(); i.hasMoreElements();) { 
    JarEntry entry = i.nextElement(); 
    if (entry.getName().endsWith(".properties")) { 
     // Load the property file 
    } 
} 
+0

¡Impresionante! Esto incluso funciona en Android. El truco es comenzar con 'classResource = AnyClassInTheApp.class.getResource ("/AndroidManifest.xml ")'. Las entradas enumeradas en el jar serán los contenidos del APK. – TWiStErRob

Cuestiones relacionadas