Ordner aus Jar - File auf Festplatte kopieren?

Status
Nicht offen für weitere Antworten.

geneticZ

Bekanntes Mitglied
Hallo allerseits,
ich habe in einem Jar - File einen Ordner, beispielsweise images/ der Bilder enthält und hätte diese gerne an einen bestimmten Ort kopiert auf meiner Festplatte.

Wie muss ich da vorgehen?
Ich habe es schonmal mit dem copyDir Skript aus den FAQs versucht, bin da aber nicht so wirklich weiter gekommen.
Vor allem bei der Quelldatei bleibe ich da denke ich hängen...

vielen Dank für eure Hilfe
mfg
geneticZ
 
Da es in einem jar keine Verzeichnisse, sondern nur Entries gibt, funktioniert das out-of-the-box gar nicht.
Eine Möglichkeit besteht darin, die Entries auszuwerten und alles was mit images beginnt wird kopiert.
Die andere Möglichkeit ist eine externe Lib wie TrueZip dafür zu verwenden.
 
oh, also das müsst ihr mir genauer erklären! 🙁

Also ich habe in meiner Jar einen Ordner der samt Inhalt einfach nur auf die Festplatte gebracht werden soll.
Wie muss ich nun vorgehen?

Bzw was ist da so die "normale" Lösung auch bezüglich True Zip usw?
Wie würde das dann funktionieren?

Danke für die Hilfe
mfg
geneticZ
 
Du hast in einem Jar kein Verzeichnis (ja, so heißen die, ein Ordner ist eine visuelle Repräsentation eines Verzeichnisses), sondern einen Zip-Entry. Das ist kein Verzeichnis, sondern ein String über den bytes assoziert werden können.
Ich würde was immer du in dem Jar verpacken willst in ein zip stecken, das zip per getResource aus dem Jar holen und das dann entpacken.
 
Hallo,
sorry ich komm damit nicht wirklich klar!
Bin leider erst auf Java umgestiegen :cry:

Was ich bis jetzt gemacht habe:

Ich habe eine jar Datei und im Jar ein .rar-File in dem sich eben zb nur die Bilder befinden.
Will ich jetzt auf diese Bilder zugreifen und in ein neues Verzeichnis auf meiner Festplatte kopieren,
muss ich mit dem Befehl getResource() arbeiten... richtig?
Code:
InputStream in1 = cpyFile.class.getResourceAsStream( "meinJarFile.jar"
                           + System.getProperty("file.separator")
                           + meinRarFile.rar
                           + System.getProperty("file.separator")
                           + "meinBild.jpg" );

Oder wie funktioniert das?
Bin echt Ahnungslos 🙁

Danke
 
Hallo,
erstmal Danke für das Skript, dass hat mir wirklich sehr weitergeholfen.
An einer Sache hänge ich jedoch nach wie vor :cry:

Ich schaffe es nun ein bestehendes Jar File, dass an einer vorgegebenen Position auf meiner Festplatte liegt,
auszulesen und in ein anderes Verzeichnis zu kopieren! Soweit ist das schonmal gut...

Womit ich nun Probleme habe ist das auslesen des Jar Files welches in einem anderen Jar-File das ausgeführt wird drinnen steckt.
Ich weiss das soll ich damit machen
Code:
getClass().getResourceAsStream("meinJar.jar");

bekomm das aber leider nich gebacken.

Code:
new ZipArchiveExtractor().extractArchive(new File(
		"d:/meinJar.jar"), new File(
		"c:/meinJar"));

So gehts bereits...
Wie gesagt aber aus nem Jar das Jar auszulesen und dann als new File zu übergeben, dass klappt leider noch gar nicht :roll:

Danke für die Hilfe
geneticZ
 
Sorry ich schaff es nich 🙁

Code:
public void readJar() throws Exception{
			InputStream quelle = getClass().getResourceAsStream("Script.jar");
			String rFile = quelle.toString();
			new ZipArchiveExtractor().extractArchive(new File(
					rFile), new File(
					"c:/SCRIPT"));
		}

Ich weiss dass es nicht stimmt, aber ich kapier einfach nicht wie das laufen soll.

Die 2 Hauptprobleme für mich als Unwissenden sind:
- getClass() darf in keiner static function sein, ich weiss nicht wie ich die Funktion sonst ansprechen kann.
- die Konvertierung von InputStream auf File

Danke für die Hilfe
geneticZ
 
-In einer statischen Methode: DeineClass.class.getResource
-InputStreams werden nicht auf File 'konvertiert'. In einem jar sind nunmal keine Dateien, sondern nur resourcen, mehr als einen InputStream bekommst du nicht.
 
Wildcard hat gesagt.:
-InputStreams werden nicht auf File 'konvertiert'. In einem jar sind nunmal keine Dateien, sondern nur resourcen, mehr als einen InputStream bekommst du nicht.

Ok, aber dann kann ich nicht mehr iterativ bzw mit enumeration durch die Resourcen gehen. :?
Wie soll ich das dann machen

Hier der Code:
Code:
public void extractArchive(InputStream quelle, File destDir) throws Exception {
		if (!destDir.exists()) {
			destDir.mkdir();
		}

		InputStream zipFile = quelle; // hier wäre es normalerweise eine File Variable!!!
		Enumeration entries = zipFile.entries();

		byte[] buffer = new byte[16384];
		int len;
		while (entries.hasMoreElements()) {
			ZipEntry entry = (ZipEntry) entries.nextElement();

			String entryFileName = entry.getName();

			File dir = buildDirectoryHierarchyFor(entryFileName, destDir);
			if (!dir.exists()) {
				dir.mkdirs();
			}

			if (!entry.isDirectory()) {
				BufferedOutputStream bos = new BufferedOutputStream(
						new FileOutputStream(new File(destDir, entryFileName)));

				BufferedInputStream bis = new BufferedInputStream(zipFile
						.getInputStream(entry));

				while ((len = bis.read(buffer)) > 0) {
					bos.write(buffer, 0, len);
				}

				bos.flush();
				bos.close();
				bis.close();
			}
		}
	}

Vielen Dank für die Hilfe :toll:
 
Wildcard hat gesagt.:
ZipInputStream. Das hatte ich dir aber schon geschrieben

langsam geh ich kaputt :autsch:

ZipInputStream kann ich auch nicht mit nem Iterator durchlaufen...
Schau mal bitte ob das so passt:

Code:
public static void main(String[] args, String path) throws Exception {
		ZipInputStream quelle = (ZipInputStream) UNZIP.class.getResourceAsStream("Script.jar");
		new UNZIP().extractArchive(quelle, new File(
				"c:/SCRIPT"));
	}
}

ich kann nur mit nem Cast C.class.getResourceAsStream("") verwenden 🙁

Code:
public void extractArchive(ZipInputStream archive, File destDir) throws Exception {
		if (!destDir.exists()) {
			destDir.mkdir();
		}
		ZipInputStream quelle = new ZipInputStream(archive);
		for(Iterator<ZipInputStream> iter =  quelle.iterator(); iter.hasNext();){ //HIER SAGT ER ITERATOR GEHT NICHT!!!
			ZipInputStream psVersion = iter.next();
			System.out.println(psVersion);

iterator() lässt er hier leider auch nicht zu sondern will nen Cast auf ZipFile von mir :bahnhof:

Danke
geneticZ
 
Hallo,
ich denke ich bin weiter gekommen, aber dennoch ist das Skript leider nicht fehlerfrei.
Code:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;

public class ZipArchiveExtractor {

	/**
	 * @param args
	 */
	
	

	public void extractArchive(InputStream archive, File destDir) throws Exception {
		if (!destDir.exists()) {
			destDir.mkdir();
		}

		ZipInputStream quelle = new ZipInputStream(archive);
		

		byte[] buffer = new byte[16384];
		int len;
		while (true) {
			ZipEntry entries = quelle.getNextEntry();

			String entryFileName = entries.getName();

			File dir = buildDirectoryHierarchyFor(entryFileName, destDir);
			if (!dir.exists()) {
				dir.mkdirs();
			}

			if (!entries.isDirectory()) {
				BufferedOutputStream bos = new BufferedOutputStream(
						new FileOutputStream(new File(destDir, entryFileName)));

				BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(entries));// DIE ZEILE HIER STIMMT SICHER NICHT!!!!

				while ((len = bis.read(buffer)) > 0) {
					bos.write(buffer, 0, len);
				}

				bos.flush();
				bos.close();
				bis.close();
			}
		}
	}

	private File buildDirectoryHierarchyFor(String entryName, File destDir) {
		int lastIndex = entryName.lastIndexOf('/');
		String entryFileName = entryName.substring(lastIndex + 1);
		String internalPathToEntry = entryName.substring(0, lastIndex + 1);
		return new File(destDir, internalPathToEntry);
	}
	
	
	
	public static void main(String[] args, String path) throws Exception {
		InputStream quelle = ZipArchiveExtractor.class.getResourceAsStream("Script.jar");
		new ZipArchiveExtractor().extractArchive(quelle, new File(
				"c:/SCRIPT"));
	}
}

wäre sehr nett wenn du mal überprüfen könntest wo ich Fehler gemacht habe!

vielen vielen Dank für deine Mühe!
mfg
geneticZ
 
stimmt der Rest?
Ausser die eine Zeile oder wie? :bahnhof:


Code:
BufferedInputStream bis = new BufferedInputStream(quelle);

so stimmts dann aber auch nich![/code]
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben