# Ordner aus Jar - File auf Festplatte kopieren?



## geneticZ (22. Aug 2008)

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


----------



## Verjigorm (22. Aug 2008)

in einem jar gibt es keine Dateien oder Verzeichnisse, sondern nur Zip-Entrys, da nützt dir die File-API nix


----------



## Wildcard (22. Aug 2008)

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.


----------



## geneticZ (22. Aug 2008)

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


----------



## Wildcard (22. Aug 2008)

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.


----------



## geneticZ (22. Aug 2008)

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?

```
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


----------



## Wildcard (22. Aug 2008)

rars sind völlig ungeeignet, weil es ein proprietäres Format ist. Wie willst du das entpacken?


----------



## geneticZ (22. Aug 2008)

ok schön, dann eben noch ein jar oder ein zip?

Das löst aber leider nicht mein Problem...  :?


----------



## Wildcard (22. Aug 2008)

Einen Stream der das Zip enthält bekommst du mit 

```
getClass().getResourceAsStream("deinZip.zip");
```
Den Stream verpackst du dann in einem ZipInputStream von dem aus du die Dateien erstellst.
Hier ein beispiel (allerdings File-basiert, das ändert aber nicht viel).
http://www.tutorials.de/forum/java/215919-zip-entpacken.html


----------



## geneticZ (23. Aug 2008)

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

```
getClass().getResourceAsStream("meinJar.jar");
```

bekomm das aber leider nich gebacken.


```
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


----------



## Wildcard (23. Aug 2008)

Die Resource auf die du mit getResource zugreifen willst, muss im Jar vorhanden sein und im Classpath der Jar liegen.


----------



## geneticZ (23. Aug 2008)

Sorry ich schaff es nich   


```
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


----------



## Wildcard (23. Aug 2008)

-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.


----------



## geneticZ (23. Aug 2008)

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:

```
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 (23. Aug 2008)

ZipInputStream. Das hatte ich dir aber schon geschrieben


----------



## geneticZ (23. Aug 2008)

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:


```
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   


```
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


----------



## Wildcard (23. Aug 2008)

API lesen.
http://java.sun.com/javase/6/docs/api/java/util/zip/ZipInputStream.html#getNextEntry()


----------



## geneticZ (23. Aug 2008)

Hallo,
ich denke ich bin weiter gekommen, aber dennoch ist das Skript leider nicht fehlerfrei.

```
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


----------



## Wildcard (23. Aug 2008)

Du hast doch einen InputStream. Den ZipInputStream.


----------



## geneticZ (23. Aug 2008)

stimmt der Rest? 
Ausser die eine Zeile oder wie?  :bahnhof: 



```
BufferedInputStream bis = new BufferedInputStream(quelle);
```

so stimmts dann aber auch nich![/code]


----------



## geneticZ (24. Aug 2008)

push


----------

