Datei aus.jar extern speichern

  • Themenstarter Themenstarter kaetzacoatl
  • Beginndatum Beginndatum
K

kaetzacoatl

Gast
Hallo,

ich versuche eine Datei aus einer jar in ein Verzeichnis zu kopieren.
Ich habe es schon mit getClass().getResource("/image.png") probiert,
aber die URL die ich bekomme kann ich nicht in eine Datei umwandeln,
die ich dann Speichern kann.

Schon mal im Vorraus Danke!
 
Hallo,

ich versuche eine Datei aus einer jar in ein Verzeichnis zu kopieren.
Ich habe es schon mit getClass().getResource("/image.png") probiert,
aber die URL die ich bekomme kann ich nicht in eine Datei umwandeln,
die ich dann Speichern kann.

Schon mal im Vorraus Danke!

jar xf jarFile FileName

Bsp. Deine jarfile MyJar.jar beinhaltet ein datei MyPic.gif

jar xf MyJar.jar MyPic.gif
 
Wie wär's mit:
Java:
try {
	FileOutputStream out = new FileOutputStream(new File("Pfad/Die/Die/Datei/Haben/Soll"));
	InputStream in = getClass().getResourceAsStream("Dateiname");

	while (in.available() > 0)
		out.write(in.read());
			
	out.close();
	in.close();
} catch (Exception e) {
	e.printStackTrace();
}
 
Ich habe es schon mit getClass().getResource("/image.png") probiert,
aber die URL die ich bekomme kann ich nicht in eine Datei umwandeln,
die ich dann Speichern kann.
Nimm getResourceAsStream(). Du erhältst einen InputStream. Die Daten aus dem InputStream musst Du in einen (File-)OutputStream umleiten. Das kannst Du entweder selbst programmieren (Google hilft bei der Suche nach Beispielcode und findet u.a. dies: Copy Bytes from InputStream to OutputStream - Android | Developer Feed) oder Du bedienst Dich einer Library, die eine entsprechende Methode bereit stellt, z.B. Apache commons-io mit der Klasse IOUtils (IOUtils (Commons IO 2.4 API))
 
Nimm getResourceAsStream(). Du erhältst einen InputStream. Die Daten aus dem InputStream musst Du in einen (File-)OutputStream umleiten. Das kannst Du entweder selbst programmieren (Google hilft bei der Suche nach Beispielcode und findet u.a. dies: Copy Bytes from InputStream to OutputStream - Android | Developer Feed) oder Du bedienst Dich einer Library, die eine entsprechende Methode bereit stellt, z.B. Apache commons-io mit der Klasse IOUtils (IOUtils (Commons IO 2.4 API))

Evtl. wäre es sinnvoll, erst die geposteten (2) Antworten zu lesen, bevor man das exakt Gleiche nochmal schreibt 😉
 
Wenn es nur darum geht ein File zu entpacken kannst du das auch mit dem Zip program deiner Wahl machen. Oder via command-line siehe Beitrag von Poltergeist.
 
Ikaron hat gesagt.:
Evtl. wäre es sinnvoll, erst die geposteten (2) Antworten zu lesen, bevor man das exakt Gleiche nochmal schreibt
Stimmt. Wobei ich nur Antwort 1 vorher lesen konnte und mir da schon dachte, dass das nicht die gewünschte Lösung ist. Für meine Antwort habe ich tatsächlich mehrere Minuten gebraucht und deswegen nicht bemerkt, dass Du das mit den Streams schon geschrieben hattest.

Aber wo wir grad dabei sind, uns gegenseitig zu dissen😉, Dein Code ist nun nicht gerade sehr advanced.😀
  • new File ist unnötig, der FileInputStream nimmt auch direkt String als Parameter. Wenn Du also nicht vorher eine der File-Methoden (bspw. exists) aufrufen willst, braucht es keine File-Instanz
  • Der Zugriff auf Files sollte gepuffert werden in diesem Fall also noch einen BufferedInputStream drumbasteln oder gleich mit byte-Arrays arbeiten.
  • Die bytes einzeln aus einem Stream zu lesen, ist auch nicht optimal
 
Stimmt. Wobei ich nur Antwort 1 vorher lesen konnte und mir da schon dachte, dass das nicht die gewünschte Lösung ist. Für meine Antwort habe ich tatsächlich mehrere Minuten gebraucht und deswegen nicht bemerkt, dass Du das mit den Streams schon geschrieben hattest.

Aber wo wir grad dabei sind, uns gegenseitig zu dissen😉, Dein Code ist nun nicht gerade sehr advanced.😀
  • new File ist unnötig, der FileInputStream nimmt auch direkt String als Parameter. Wenn Du also nicht vorher eine der File-Methoden (bspw. exists) aufrufen willst, braucht es keine File-Instanz
  • Der Zugriff auf Files sollte gepuffert werden in diesem Fall also noch einen BufferedInputStream drumbasteln oder gleich mit byte-Arrays arbeiten.
  • Die bytes einzeln aus einem Stream zu lesen, ist auch nicht optimal

Ja egal, bin auch erst Anfänger 😉 Sollte auch nicht bös rüberkommen^^ Wäre allerdings nett, wenn du Punkt 2 und 3 erklären könntest. Beim 3. hab ich das extra getestet, kam aber auf die selbe Geschwindigkeit hinaus, deshalb hab ich's gelassen^^
 
Ikaron hat gesagt.:
Sollte auch nicht bös rüberkommen^^
Meine Antwort war schon ein bischen böse gemeint 😉, tut mir aber jetzt Leid.
Ikaron hat gesagt.:
Wäre allerdings nett, wenn du Punkt 2 und 3 erklären könntest. Beim 3. hab ich das extra getestet, kam aber auf die selbe Geschwindigkeit hinaus, deshalb hab ich's gelassen^^
Wenn man Daten von der Festplatte in einem Rutsch lesen kann, geht das in der Regel schneller, als wenn man mehrfach auf die Platte zugreift. Bei kleinen Dateien reichen evtl. vorhandene Festplatten- oder Betriebssystemcaches noch aus, um Mehrfachzugriffe zu vermeiden. Da fällt es also nicht ins Gewicht. Deswegen hast Du bei Deinem Test wahrscheinlich auch keinen Unterschied fest gestellt. Bei größeren Dateien hat das aber negative Auswirkungen. Auch wenn es in diesem Fall vielleicht eine Mikro-Optimierung ist, sollte man sich es einfach angewöhnen, immer zu puffern.
 
Ist mit einem Einzeiler (daher mag ich Java 7 😉 ) leicht möglich:

Files.copy( getClass().getResourceAsStream("/image.png"), Paths.get(deinPfadHier) );
 

Zurück
Oben