2010-06-02 6 views
5

Ho familiarità con l'ottenimento del contenuto di un file di proprietà dato il nome del file e ovviamente MyClass.class.getResource ('*. Properties') non funzionerà, ma come posso ottenere un elenco di TUTTI i file delle proprietà si trova nello stesso pacchetto della mia classe?È possibile caricare dinamicamente tutti i file di proprietà contenuti in un pacchetto? Ad esempio MyClass.class.getResource ('*. properties');

+0

Questo è facile con la Primavera, così sulla remota possibilità che si sta utilizzando, posso darvi una risposta in base a molla. – skaffman

+3

Ok ... quindi sto iniziando a pensare che non sia possibile. Da quanto ho capito, Java utilizza il lazy classloading e quindi il classloader non sa cosa contiene un pacchetto finché non viene richiesto di recuperare una classe. La cosa più vicina che riesco a fare è * tentare * di risolvere il nome di un pacchetto nella directory, ottenere un elenco di oggetti di scena. file nella directory e tentare di caricarli tramite class.getResource(). So che è un trucco; C'è un modo migliore? – Stoney

+0

Aha! Sembra che funzioni, qualsiasi risposta che utilizzi Spring è abbastanza accettabile e sarebbe molto apprezzata – Stoney

risposta

6

Supponendo che non sia confezionato in JAR, è possibile utilizzare File#listFiles() per questo. Ecco un esempio kickoff:

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"); 
    } 
}); 

Se si tratta di JAR-confezionato, allora avete bisogno di un po 'più di codice, per cominciare JarFile API. È possibile trovare un altro esempio in this answer.

+0

Siamo spiacenti, nessun file consentito. La classe non è attualmente in un barattolo ... ma non so cosa riserva il futuro per la mia classe e non ho alcun controllo sull'ambiente in cui verrà eseguito, quindi deve essere il più disaccoppiato possibile – Stoney

+0

Scusa ... non ho abbastanza punti per votare la tua risposta ancora ... – Stoney

1

Ecco come ho fatto,

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

Fantastico! Funziona anche su Android. Il trucco è iniziare con 'classResource = AnyClassInTheApp.class.getResource ("/AndroidManifest.xml ")'. Le voci elencate nel contenitore saranno i contenuti dell'APK. – TWiStErRob

Problemi correlati