2016-11-11 1 views
0

Ich versuche, die CHM-Datei, die Hilfe enthält anzuzeigen, die von Ressourcen geladen wird:Java, von Ressourcen in jar geladen CHM-Datei Anzeige

try 
{ 
    URL url = this.getClass().getResource("/resources/help.chm"); 

    File file = new File(url.toURI()); 
    Desktop.getDesktop().open(file);  //Exception 
} 

catch (Exception e) 
{ 
    e.printStackTrace(); 
} 

Wenn das Projekt von NetBeans ausgeführt wird, wird die Hilfedatei angezeigt korrekt. Leider funktioniert es nicht, wenn das Programm von der JAR-Datei ausgeführt wird; Es führt zu einer Ausnahme.

Meiner Meinung nach wurde die interne Struktur von jar von URI beschrieben nicht erkannt ... Gibt es einen besseren Weg? Zum Beispiel mit der BufferReader-Klasse?

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 

Ein analoges Problem mit der JPG-Datei mit der BufferedImage Klasse wurde ohne Konvertierung zu URI ...

Danke für Ihre Hilfe ...

+0

Eine .jar-Datei ist eine Zip-Datei mit einer anderen Erweiterung. Ein Eintrag in einer .jar-Datei ist selbst keine Datei, und das Erstellen eines Dateiobjekts aus einer .jar-Ressourcen-URL funktioniert * nie *. Verwenden Sie [getResourceAsStream] (http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#getResourceAsStream-java.lang.String-) und [den Stream kopieren] (http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#copy-java.io.InputStream-java.nio.file.Path-java.nio.file.CopyOption .. .-) in eine temporäre Datei. – VGR

+0

@ VGR: Danke für Ihren Kommentar. Leider kann es wahrscheinlich nicht getan werden. Das Programm wird als Java Web Start-Anwendung ausgeführt, einige zusätzliche Rechte werden benötigt (oder nicht?) ... – justik

+0

Wenn Sie die Berechtigung zum Ausführen von Desktop.open haben, denke ich, dass Sie die Berechtigung haben, [eine temporäre Datei zu erstellen] (http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempFile-java.lang.String-java.lang.String-java.nio.file.attribute. FileAttribute ...-). – VGR

Antwort

1

BufferedImage img = null; 
URL url = this.getClass().getResource("/resources/test.jpg"); 
if (url!= null) 
{ 
    img = ImageIO.read(url); 
} 

Fest

Eine .jar-Datei ist eine Zip-Datei mit einer anderen Erweiterung. Ein Eintrag in einer JAR-Datei ist selbst keine Datei, und der Versuch, ein Dateiobjekt aus einer JAR-Ressourcen-URL zu erstellen, funktioniert nie. Verwenden Sie getResourceAsStream und kopieren Sie den Strom in eine temporäre Datei:

Path chmPath = Files.createTempFile(null, ".chm"); 

try (InputStream chmResource = 
    getClass().getResourceAsStream("/resources/help.chm")) { 

    Files.copy(chmResource, chmPath, 
     StandardCopyOption.REPLACE_EXISTING); 
} 

Desktop.getDesktop().open(chmPath.toFile()); 

Als Alternative, je nachdem, wie einfach Ihre Hilfe Inhalt ist, könnten Sie einfach speichern Sie es als eine einzelne HTML-Datei, und übergeben Sie die Ressourcen-URL zu einem nicht - editierbarer JEditorPane. Wenn Sie ein Inhaltsverzeichnis, einen Index und eine Suche haben möchten, sollten Sie überlegen, wie Sie JavaHelp verwenden können.

+0

@ VGR, vielen Dank, es funktioniert ... Aber ist es eine übliche Art, mit chm-Dateien zu arbeiten? Was ist mit einem "direkteren" Ansatz als die temporäre Datei? :-) – justik

+0

Eine .jar-Datei ist ein Zip-Archiv. Seine Einträge sind keine separaten Dateien, Punkt. Es gibt keinen direkteren Weg. – VGR

+0

@ VGR: Vielen Dank wieder für Ihre Erklärung und Geduld ... – justik

Verwandte Themen