2013-01-04 15 views
11

Jak przekonwertować nazwę pliku ze ścieżki klasy na prawdziwą nazwę pliku?Konwertowanie nazwy ścieżki klasy do rzeczywistej nazwy pliku

Załóżmy na przykład, że katalog "C:\workspace\project\target\classes" znajduje się w ścieżce klas. W tym katalogu znajduje się plik, taki jak info.properties.

Jak określić (w czasie wykonywania) bezwzględną ścieżkę do pliku info.properties, biorąc pod uwagę tylko ciąg "info.properties"?

Wynik będzie podobny do "C:\workspace\project\target\classes\info.properties".

Dlaczego ta funkcja jest przydatna? Podczas pisania testów jednostkowych możesz chcieć uzyskać dostęp do plików dołączonych do zasobów testowych (src/main/resources), ale pracujesz z biblioteką innej firmy lub innym systemem, który wymaga prawdziwej nazwy pliku, a nie względnego odniesienia do klasy classpath.

Uwaga: Sam odpowiedziałem na to pytanie, ponieważ uważam, że jest to przydatna sztuczka, ale wygląda na to, że nikt wcześniej nie zadał tego pytania.

Odpowiedz

16

Użyj kombinacji ClassLoader.getResource() i() URL.getFile

URL url = Thread.currentThread().getContextClassLoader().getResource(resource); 
if(url == null){ 
    throw new RuntimeException("Cannot find resource on classpath: '" + resource + "'"); 
} 
String file = url.getFile(); 

Uwaga dla systemu Windows: w powyższym przykładzie, rzeczywisty wynik będzie

"/C:/workspace/project/target/classes/info.properties" 

Jeśli potrzebujesz bardziej podobnej do systemu Windows ścieżki (np. "C:\workspace\..."), użyj:

String nativeFilename = new File(file).getPath(); 
+5

co to da, jeśli zasób znajduje się w słoiku? – radai

+1

@radai Oto przykład wyniku dla pliku w jar: 'file:/C: /tools/some/path/jarfile.jar!/Internal/path/file.txt'. Aby znaleźć taki plik za pomocą powyższej odpowiedzi, musisz podać ścieżkę względem katalogu głównego słoika - np. '" internal/path/file.txt "' – GreenGiant

+0

@radai Sprawdź także (this) (http://stackoverflow.com/questions/12025689/filenotfoundexception-when-exporting-jar/12025740#12025740) –