2009-10-12 17 views
7

Dla pliku Desktop.open(File f) można odwoływać się do pliku znajdującego się w pliku JAR?Plik odniesienia Java Desktop.open (plik f) w obrębie JAR?

Próbowałem użyć ClassLoader.getResource(String s), konwertując go do URI, a następnie tworząc z niego Plik. Ale powoduje to IllegalArgumentException: URI is not hierarchical.

URL url = ClassLoader.getSystemClassLoader().getResource(...); 
System.out.println("url=" + url); // url is valid 
Desktop.getDesktop().open(new File(url.toURI())); 

Możliwość jest the answer at JavaRanch, która ma utworzyć plik tymczasowy z zasobu w JAR - nie bardzo elegancki.

Działa w systemie Windows XP.

+1

W rzeczywistości utworzenie tymczasowego pliku jest dobrym rozwiązaniem. Możesz stworzyć dla niej "elegancką" bibliotekę, więc nie musisz jej kodować za każdym razem. – OscarRyz

Odpowiedz

6

"Pliki" wewnątrz plików .jar nie są plikami w systemie operacyjnym. Są to tylko niektóre obszary pliku .jar i są zwykle skompresowane. Nie są adresowalne jako oddzielne pliki przez system operacyjny i dlatego nie mogą być wyświetlane w ten sposób.

Java sama w sobie ma dobry sposób na odniesienie się do tych plików przez jakiś URI (jak zdałeś sobie sprawę z użycia getResource()), ale jest to całkowicie specyficzne dla Javy.

Jeśli chcesz jakąś zewnętrzną aplikację aby uzyskać dostęp do pliku, masz dwa możliwe rozwiązania:

  1. podać jakiś znormalizowany sposób dostępu do pliku lub
  2. złożenia wniosku w stanie rozwiązać pliki, które są spakowane w pliku .jar (lub .zip).

Zazwyczaj 2 tak naprawdę nie jest opcją (chyba, że ​​druga aplikacja jest również napisana w Javie, w takim przypadku jest to raczej łatwe).

Opcja 1 jest zwykle wykonywana po prostu poprzez zapisanie w pliku tymczasowym i nawiązanie do tego. Alternatywnie możesz uruchomić mały serwer sieciowy i dostarczyć plik za pomocą adresu URL.

+0

Tak naprawdę mam wbudowany serwer WWW (Jetty) w aplikacji. Wtedy problem polega na tym, że Desktop.browse (URI) uruchamia tylko przeglądarkę, a nie aplikację. –

+1

@Kuo: Tak, zdałem sobie sprawę, że zapytałeś o open() po dodaniu mojej edycji. Oczywiście dla open() przydatne jest tylko rozwiązanie plików tymczasowych. –

3

Zasób w pliku JAR po prostu nie jest plikiem, więc nie można go użyć do uzyskania numeru File. Jeśli używasz czegoś, co naprawdę potrzebuje pliku, naprawdę musisz stworzyć plik tymczasowy i otworzyć go.

1

Ale wpis w pliku JAR to , a nie File! Plik JAR jest plikiem; jej wpisy to wpisy w pliku JAR (w celu stwierdzenia oczywistości).

Java zawiera abstrakcje, które oznaczają, że niekoniecznie musisz pracować z File s - dlaczego nie użyć Reader lub InputStream do enkapsulacji wejścia?

0

Nie, to nie jest, bo jak tylko świadkami nie masz poprawny plik w pierwszej kolejności

Z artykułu: Using the Desktop API in Java SE 6 mamy

OPEN: Reprezentuje otwarte działania wykonywane przez aplikację związaną z otwarciem konkretny typ pliku

Więc trzeba by mieć ważny plik, a następnie aplikacja powiązana z tym plikiem, aby system operacyjny mógł go otworzyć.Chociaż taka aplikacja może istnieć, musisz nadal rozumieć adres URL do pliku.