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');
risposta
È possibile eseguire questo tipo di operazioni con Spring. Vedere 4. Resources, in modo particolare (o notoriamente?) (O principalmente?) (O principalmente?) A 4.7.2 Wildcards in application context constructor resource paths.
Maledizioni, qualcuno mi ha rubato il tuono :) Avere un biscotto. +1 – skaffman
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.
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
Scusa ... non ho abbastanza punti per votare la tua risposta ancora ... – Stoney
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
}
}
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
Questo è facile con la Primavera, così sulla remota possibilità che si sta utilizzando, posso darvi una risposta in base a molla. – skaffman
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
Aha! Sembra che funzioni, qualsiasi risposta che utilizzi Spring è abbastanza accettabile e sarebbe molto apprezzata – Stoney