2014-10-31 8 views
7
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
URL url = classLoader.getResource("com/x/y/z.cfg"); 
File file = new File(url.getPath()); 

Działa to podczas uruchamiania pliku JAR z Eclipse, ale nie działa podczas działania w pliku JAR.classLoader.getResource nie działa w pliku JAR

java.io.FileNotFoundException: Plik: \ c: \ Użytkownicy \ \ nova pulpitu \ Matcher.jar \ c om \ x \ r \ z.cfg

nie jest duplikat. Sprawdziłem wszystkie pozostałe pytania, brak użytecznych informacji.

+1

Co chcesz zrobić z tym "plikiem", gdy już go masz? Nie możesz utworzyć "pliku" z "adresu URL", który dostajesz dla zasobu w pliku JAR (ponieważ nie jest to adres URL 'file:', zwykle jest to 'jar: file: /path /to/file.jar!/com/x/y/z.cfg'), ale jeśli API, którego używasz, może zaakceptować 'URL' lub' InputStream' zamiast 'File', to nie musisz tego robić. –

+6

Zostało to wyjaśnione wiele razy: [tutaj] (http://stackoverflow.com/questions/944610/how-do-i-access-a-config-file-inside-the-jar), [tutaj] (http: //stackoverflow.com/questions/20389255/java-reading-a-resource-file-from-within-jar), [tutaj] (http://stackoverflow.com/questions/403256/how-do-i-read -a-resource-file-from-a-java-jar-file? rq = 1). Rezon jest tak naprawdę, ponieważ File reprezentuje obiekt systemu plików, a zawartość słoika nie jest dostępna dla systemu plików (ale Java może nim w pewien sposób poradzić - jako InputStream). –

+0

URL.getFile() * nie * konwertuje adresu URL na poprawną ścieżkę pliku. Zwraca jedynie ścieżkę adresu URL. (W czasach Java 1.0 większość adresów URL odwoływała się do plików fizycznych, dlatego metoda nazywa się getFile.) – VGR

Odpowiedz

11

Gdy plik jest dołączony do słoika, staje się on strumieniem bajtów zamiast zwykłego obiektu pliku.

Spróbuj

InputStream stram=getClass().getClassLoader().getResourceAsStream(relativePath); 

More Tutorial...

Czytaj podobnym stanowisku here i here

1

nie można utworzyć instancję pliku, ponieważ tylko masz plik jest JAR. Właśnie dlatego getResource() zwraca URL. Możesz pobrać strumień, używając metody URL.openStream() do odczytania zawartości.

Powiązane problemy