PDF-Datei aus JAR-Archiv in Dateisystem kopieren

JMarkus

Mitglied
Hallo,
ich möchte gern mit meinem Programm zusammen (Jar-Archiv) ein Handbuch (pdf-Datei) ausliefern, welches sich über F1-Taste öffnet. Dass man diese pdf-Datei nicht direkt mit
Code:
Desktop.getDesktop().open()
öffnen kann habe ich schon gelernt.

Als Lösung habe ich erfahren, dass man die Datei einfach aus dem Jar-Archiv befreien und sie ins normale Dateisystem (z. B. Temp-Verzeichnis) bringen muss. Soweit so gut. Nun habe ich die wildesten Code-Beispiele gesehen, wie dies erfolgen könnte (über Streams teils gepuffert usw.).

Ich wollte nicht wahr haben, dass dafür so ein "Aufwand" betrieben werden muss und habe eine schlichte Lösung programmiert.
Java:
URL url = getClass().getResource("/de/package/hlp/Benutzerhandbuch.pdf");
Path copyTargetPath = Paths.get(System.getProperty("java.io.tmpdir") + "/Benutzerhandbuch.pdf");
Path copySourcePath = null;
if (!Files.exists(copyTargetPath)) {
   try {
      copySourcePath = Paths.get(url.toURI());
      Files.copy(copySourcePath, copyTargetPath);
   } catch (URISyntaxException | IOException ex) {
      System.out.println("Konnte Benutzerhandbuch nicht kopieren.");
   }
}
try {
      Desktop.getDesktop().open(copyTargetPath.toFile());
} catch (IOException ex) {
      System.out.println("Konnte Benutzerhandbuch nicht öffnen.");
}

Jetzt die Frage: Ist diese Lösung nicht optimal oder was würdet ihr anders machen (und warum)?
 
Zuletzt bearbeitet:
Das Ganze hat einen Haken... es funktioniert nicht 😀
Mit einem einfachen "copy" kann man anscheinend nicht aus dem Jar-Archiv in das Dateisystem kopieren. Etwas abgewandelt sieht die Lösung dann folgendermaßen aus:
Java:
Path target = Paths.get(System.getProperty("java.io.tmpdir"), "Benutzerhandbuch.pdf");
if (!Files.exists(target)) {
    InputStream source = getClass().getResourceAsStream("/de/package/hlp/Benutzerhandbuch.pdf");  
    try {
        Files.copy(source, target);
    } catch (IOException ex) {
        System.err.println("Konnte Benutzerhandbuch-Datei nicht kopieren.");
    } finally {
        try {
            source.close();
        } catch (IOException ex) {
           System.err.println("Konnte InputStream nicht schließen.");
        }
    }
}   
try {
    Desktop.getDesktop().open(target.toFile());
} catch (IOException ex) {
    System.err.println("Konnte Benutzerhandbuch nicht öffnen.");
}
Das funktioniert auch plattformübergreifend 🙂
Falls es mal jemand braucht....
 
Zuletzt bearbeitet:

Zurück
Oben