2016-08-22 13 views
6

Próbuję uzyskać dostęp do zasobu z pliku jar. Zasób znajduje się w tym samym katalogu, w którym znajduje się słoik.Dostęp do zasobu poza słojem ze słoiczka

my-dir: 
tester.jar 
test.jpg 

Próbowałem różnych rzeczy, w tym następujących, ale za każdym razem, gdy strumień wejściowy jest zerowy:

[1]

String path = new File(".").getAbsolutePath(); 
InputStream inputStream = this.getClass().getResourceAsStream(path.replace("\\.", "\\") + "test.jpg"); 

[2]

File f = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); 
InputStream inputStream = this.getClass().getResourceAsStream(f.getParent() + "test.jpg"); 

Czy ty daj mi jakieś wskazówki? Dzięki.

+1

'getResourceAsStream' dostaje zasobu ze słoika. https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html – tkausl

+1

"getResourceXXX" załaduje zasoby ze ścieżki klas, potrzebne jest otwarcie pliku jpg jako pliku lub dodanie -dir do ścieżki klas. – folkol

+1

Czy próbowałeś podzielić kod, więc masz przynajmniej pewność, że uzyskasz poprawną ścieżkę do pliku ** .jpg **? –

Odpowiedz

5

Jeżeli jesteś pewien, że twoja aplikacja bieżący folder jest folder ze słoika, można po prostu zadzwonić InputStream f = new FileInputStream("test.jpg");

W getResource metody załaduje rzeczy używając classloader, a nie za pośrednictwem systemu plików. Właśnie dlatego Twoje podejście (1) nie powiodło się.

Jeśli folder zawierający plik obrazu *.jar i jest w ścieżce klasy, można uzyskać zasobu obrazu tak, jakby to było na domyślnym pakietem:

class.getClass().getResourceAsStream("/test.jpg"); 

UWAGA: Obraz jest teraz załadowany do classloader i dopóki działa aplikacja, obraz nie jest rozładowywany i obsługiwany z pamięci po ponownym załadowaniu.

Jeśli ścieżka zawierająca plik jar nie jest podana w ścieżce klasy, twoje podejście do uzyskania ścieżki pliku jarfile jest dobre. Ale wtedy po prostu dostęp do pliku bezpośrednio przez URI, otwierając strumień na nim:

URL u = this.getClass().getProtectionDomain().getCodeSource().getLocation(); 
// u2 is the url derived from the codesource location 
InputStream s = u2.openStream(); 
0

Zastosowanie this tutorial aby pomóc Ci stworzyć URL do pojedynczego pliku w pliku jar.

Oto przykład:

String jarPath = "/home/user/myJar.jar"; 
String urlStr = "jar:file://" + jarPath + "!/test.jpg"; 
InputStream is = null; 
try { 
    URL url = new URL(urlStr); 
    is = url.openStream(); 
    Image image = ImageIO.read(is); 
} 
catch(Exception e) { 
    e.printStackTrace(); 
} 
finally { 
    try { 
     is.close(); 
    } catch(Exception IGNORE) {} 
} 
Powiązane problemy