2016-03-23 4 views
0

In dem folgenden Codebeispiel, wenn ich den Code in Eclipse testen, funktioniert es einwandfrei. Allerdings, wenn ich die JAR-Datei exportieren und über die Kommandozeile testen, wirft er einen Fehler: IIOException: Can't read input file!Exportierte Jar-Datei liest die Datei nicht in Jar

private BufferedImage img = null; 
private String imgSource; 

if (img == null) 
{ 
    try { 
     URL url = getClass().getResource("Images/questionMark.png"); 
     System.out.println(url.getPath()); 
     /* This prints: file:/C:/Users/Keno/Documents/javaFile.jar!/javaFile/Images/questionMark.png */ 
     File file = new File(url.getPath()); 
     img = ImageIO.read(file); 
     imgSource = file.getName(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Die Datei, die ich zu bekommen in der Bilder-Ordner befindet, der innerhalb des javaFile Paket. Ich habe eine Sache bemerkt, die auf das Problem hinweisen könnte.

  1. In der print-Anweisung, die ich habe, bemerke ich ein Ausrufezeichen am Ende des Abschnitts javaFile.jar. Ist das korrekt? Könnte das auf ein Problem mit der Datei oder Struktur hinweisen?

auch, falls jemand einen besseren Vorschlag hat, wie ich die Datei laden sollte, werde ich Ihnen meine Absichten erzählen. Ich möchte die Datei von einem relativen Speicherort (Images-Ordner) im Jar laden. Ich möchte es anzeigen (bereits in meinem tatsächlichen Code getan) und auch den Speicherort speichern, der später an eine andere Funktion übergeben wird (auch getan).

+3

try versuchen. GetResourceAsStream –

+0

@ oliv37 Das würde bedeuten, ich URL in ein Inputstream drehen müsste. Müsste ich es dann in eine Datei konvertieren? –

+0

ImageIO.read (inputStream) –

Antwort

1

diesen mit getClass()

public void test() { 
    try(InputStream is = getClass().getResourceAsStream("Images/questionMark.png")) { 
     ImageIO.read(is); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

So funktionierte es, aber meine einzige Sorge ist, dass die Verwendung des InputStream ein wenig langsamer als das Lesen aus einer Datei schien. Gibt es eine Möglichkeit, es zu beschleunigen oder so? –

+0

Ich glaube nicht, dass es langsamer ist, als die Methode read mit Dateiargument aufzurufen. Wenn Sie sich den Quellcode der Lesemethode ansehen -> http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/javax/imageio/ImageIO.java#ImageIO .read% 28java.io.File% 29 Sie werden sehen, dass es einen InputStream erstellt. –

+0

Oh, das bedeutet wahrscheinlich etwas anderes in meinem Code scheint es zu verlangsamen. Ich weiß, was das Problem jetzt ist. Danke noch einmal! –

0

Sie sollten versuchen zu überprüfen, ob Ihre Klasse im selben Verzeichnis wie Bilder in Ihrem Glas ist.

| 
    |- Your class 
    |- Images 
     |- questionMark.png 

Haben Sie auch versucht, direkt Ihr URL-Objekt zu verwenden?

File file = new File(url); 
+0

Sie können keine Datei von einem URL-Objekt erstellen. –

+0

Mein Fehler, ich meinte URI nicht URL – Webster