2010-06-02 5 views
5

Jestem zaznajomiony z uzyskiwaniem zawartości pliku właściwości z podaniem nazwy pliku i oczywiście MyClass.class.getResource ("*. Properties") nie będzie działać, ale jak mogę uzyskać listę WSZYSTKICH plików właściwości znajduje się w tym samym pakiecie co moja klasa?Czy możliwe jest dynamiczne ładowanie wszystkich plików właściwości zawartych w pakiecie? tj. MyClass.class.getResource ("*. properties");

+0

To jest łatwe z wiosną, więc na znikoma szansa, że ​​używasz go, mogę dać Ci odpowiedź Wiosna oparte. – skaffman

+3

Ok ... więc zaczynam myśleć, że to niemożliwe. Z mojego rozumowania Java korzysta z leniwego ładowania klas i dlatego program ładujący klasy nie wie, co jest w pakiecie, dopóki nie zostanie poproszony o pobranie klasy. Najbliższą rzeczą, jaką mogę wymyślić, jest * próba * rozwiązania nazwy pakietu do katalogu, zdobycie listy rekwizytów. pliki w katalogu i próby załadowania ich za pomocą metody class.getResource(). Wiem, że to hack; czy istnieje lepszy sposób? – Stoney

+0

Aha! To brzmi, jakby to zadziałało, każda odpowiedź wykorzystująca Spring jest całkiem do przyjęcia i byłaby bardzo doceniana – Stoney

Odpowiedz

6

Zakładając, że nie jest on zapakowany w JAR, można użyć do tego celu File#listFiles(). Oto przykład 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"); 
    } 
}); 

Jeśli to JAR-pakowane, to trzeba trochę więcej kodu, aby rozpocząć JarFile API. Możesz znaleźć inny przykład w this answer.

+0

Niestety, nie Plik jest dozwolony. Klasa nie jest obecnie w słoiku ... ale nie wiem, co przyniesie przyszłość dla mojej klasy i nie mam żadnej kontroli nad środowiskiem, w którym to nastąpi, więc musi być tak rozłączona, jak to możliwe – Stoney

+0

Przepraszam ... nie mam wystarczającej liczby punktów, aby zagłosować na odpowiedź jeszcze raz ... – Stoney

1

To jak to zrobiłem,

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

Awesome! Działa to nawet na Androidzie. Sztuczka polega na tym, że zaczyna się od 'classResource = AnyClassInTheApp.class.getResource ("/AndroidManifest.xml ")'. Wpisy wymienione w słoiku będą zawartością APK. – TWiStErRob

Powiązane problemy