# Zip/Jar - File in einem anderem Jar entpacken & auf Disk kopieren.



## stEEdZ (24. August 2008)

*Zip/Jar - File aus einem anderem Jar entpacken & auf Disk kopieren.*

Hallo allerseits,
ich habe in einem Jar File ein Zip/Jar - File und will dieses einfach auf meine Festplatte entpacken.

Durch Hilfe verschiedener Threads konnte ich mir auch etwas zusammen basteln.
Ich habe auch das Gefühl dass ich nur einen kleinen Schritt von der Lösung entfernt bin, dennoch funktioniert das Skript leider so noch nicht ganz.

Ich wäre sehr froh wenn mal jemand drüber schauen und mir meine Fehler aufzeigen könnte. 


```
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(quelle);

				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"));
	}
}
```

vielen Dank für die Hilfe
steedz


----------



## zeja (26. August 2008)

Vielleicht schreibst du noch was nicht so richtig funktioniert?


----------



## stEEdZ (26. August 2008)

Hallo,
die Grundlage dieses Skriptes ist aus einer Vorgabe hier aus dem Forum! hier
Allerdings wird hier aus einem Zip von einer Vorgegebenen Pfad ausgelesen, was bei mir in einem ausgeführten Jar wäre! Ansonsten klappt das aber super!

Ich vermute dass der/die Fehler entweder im Aufruf des Jar-Files aus dem ausgeführten Jar stecken...

```
InputStream quelle = ZipArchiveExtractor.class.getResourceAsStream("Script.jar");
```

Oder dass die Umwandlung von InputStream in main hinzu ZipInputStream in der Funktion einfach nicht stimmt...

```
public void extractArchive(InputStream archive, File destDir) throws Exception { 
//...
//...
 ZipInputStream quelle = new ZipInputStream(archive);
```

Oder dass bei  "BufferedInputStream " die Variable "quelle" eine andere sein müsste?

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

Leider bin ich mit java noch sehr unerfahren da ich erst vor 2 Wochen auf diese Sprache umgestiegen bin!
Die Fehler könnten sich also auch ganz wo anders verstecken  

Danke für die Hilfe
steedz


----------



## zeja (26. August 2008)

Ich wollte nicht wissen wo du meinst dass der Fehler ist, sondern wie sich dieser bemerkbar macht. Bekommst du eine Fehlermeldung oder wird einfach nichts entpackt? Irgendwie mußt du ja zu dem Schluß gekommen sein dass es nicht richtig funktioniert.


----------



## stEEdZ (26. August 2008)

Es entpackt einfach nicht!
Problem ist natürlich dass ich ja ein JarFile ausführen muss um überhaupt auf das andere jar zugreifen zu können, dementsprechend seh ich auch kein Exceptionhandling weil ja keine Konsole mitläuft...

Danke


----------



## zeja (26. August 2008)

Dann starte doch dein Jar in dem du in der Konsole in den Ordner des Jar wechselst und dann
java -jar deinjar.jar
eingibst.

Dann siehst du auch alles.


----------



## stEEdZ (26. August 2008)

Ok, danke für den Tip! 
Für die meisten Leute wahrscheinlich sehr trivial aber mir war das tatsächlich nicht klar, wie ich die Nachrichten anschauen kann :suspekt:

So nun zurück zum Thema...
Also ich bekomm die Exceptions:

java.lang.NullPointerException: in is null
at java.util.zip.ZipInputStream.<init>(ZipInputStream.java:56)
at ZipArchiveExtractor.extractArchive(ZipArchiveExtractor.java:26)
at ZipArchiveExtractor.main(ZipArchiveExtractor.java:69)
at Main.main(Main.java:17)

Danke für die Hilfe
steedz


----------



## zeja (26. August 2008)

Wo liegt denn dein Jar und wo das Jar welches du entpacken möchtest?


----------



## stEEdZ (26. August 2008)

Hallo,
also das jar liegt wegen mir auf C: (das is ja relativ unrelevant oder?)
Das Jar das ich quasi entpacken will liegt ganz normal im jar-file, also mein build sieht im Prinzip so aus:

>...jdk1.6.0_07/bin/jar.exe -cfmv0 meinJar.jar Manifest.txt Main.class extractJarFile.class UNZIPME.jar

UNZIPME.jar will ich quasi auspacken und auf Festplatte schupsen! (im Code is das Skript.jar)

Danke für die Hilfe
steedz


----------



## zeja (26. August 2008)

```
ZipArchiveExtractor.class.getResourceAsStream("Script.jar");
```

Wenn du das so schreibst, muss das Script.jar innerhalb deines Jars im selben Ordner wie die Klasse ZipArchiveExtractor liegen. Ist das der Fall? In Jars kann man ja mit jedem Zip-Tool reinschauen.


----------



## stEEdZ (3. September 2008)

Hallo,
entschuldige dass ich nicht früher  zurückschreiben konnte, ich war im Urlaub! ;-)

Also ein kleines Problem besteht leider immernoch... 

Das Jar-File wird entpackt! 
Jedoch nur wenn ich das hier auskommentiere:  


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

Dann erhalte ich zwar folgende Fehlermeldungen aber die Files werden entpackt!

```
Exception in thread "main" java.lang.NullPointerException
	at install.file.ZipArchiveExtractor.extractArchive(ZipArchiveExtractor.java:30)
	at install.file.ZipArchiveExtractor.main(ZipArchiveExtractor.java:63)
```

Wie ist das zu erklären? 
Was für Probleme entstehen wenn ich die Fehlermeldungen einfach missachte? 

Danke für die Hilfe
steedz


----------

