# Extract Zip Files with Java



## Developer_X (4. Okt 2009)

Hi, ich habe mal diesen Code hier aus dem Internet gefischt, denn ich will alle in einer Zip Datei befindlichen Datei extrahieren.


```
@SuppressWarnings("unchecked")
	public void extractZipFile(String s) throws Exception
    {      
        String zipname = s+".zip";
        ZipFile zipFile = new ZipFile(zipname);
        Enumeration enumeration = zipFile.entries();
        
        while (enumeration.hasMoreElements()) 
        {
        	ZipEntry zipEntry = (ZipEntry) enumeration.nextElement();
        	System.out.println("Unzipping: " + zipEntry.getName());
        	BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(zipEntry));
          
          	int size;
          	byte[] buffer = new byte[2048];
          	BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipEntry.getName()), buffer.length);
          
         	while ((size = bis.read(buffer, 0, buffer.length)) != -1) 
          	{
         		bos.write(buffer, 0, size);
        	}
        	bos.flush();
        	bos.close();
        	bis.close();
        }
    }
```

Wenn ich dies aber versuche, klappts nicht warum?

Als String übergebe ich dem parameter "Paramecium".
Folgende Fehlermeldung:

```
Unzipping: Paramecium/Paramecium.jar
java.io.FileNotFoundException: Paramecium\Paramecium.jar (Das System kann den angegebenen Pfad nicht finden)
	at java.io.FileOutputStream.open(Native Method)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at Installer.Install.extractZipFile(Install.java:47)
	at Installer.Install.<init>(Install.java:28)
	at XAE.Data$1.mouseClicked(Data.java:46)
	at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```


----------



## hdi (4. Okt 2009)

> Wenn ich dies aber versuche, klappts nicht warum?





> Das System kann den angegebenen Pfad nicht finden



Liegt das Zip im selben Verzeichnis wie das Programm? Wenn nein musst du wohl einen absoluten Pfad angeben. Vllt musst du sogar immer einen absoluten Pfad angeben.


----------



## Developer_X (4. Okt 2009)

Immer?
wow
die zip liegt im verzeichnis


----------



## Developer_X (4. Okt 2009)

ich hab mal folgendes Oben eingesetzt.

```
String zipname = s+".zip";
        File F = new File(zipname);
        System.out.println(F.getAbsolutePath());
        ZipFile zipFile = new ZipFile(F.getAbsolutePath());
        Enumeration enumeration = zipFile.entries();
```

und bekam folgende Ausgabe:

```
F:\RaymanWebpage\XAE\Paramecium.zip
java.io.FileNotFoundException: Paramecium\Paramecium.jar (Das System kann den angegebenen Pfad nicht finden)
	at java.io.FileOutputStream.open(Native Method)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at Installer.Install.extractZipFile(Install.java:49)
	at Installer.Install.<init>(Install.java:28)
	at XAE.Data$1.mouseClicked(Data.java:46)
	at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)Unzipping: Paramecium/Paramecium.jar

	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```

Was soll ich machen`?


----------



## Wookie81 (4. Okt 2009)

Developer_X hat gesagt.:


> Was soll ich machen`?


Stutzig werden weil er über Datei X meckert obwohl du ihm Datei Y gibst? Ich kann den Fehler hier nicht nachvollziehen, gib mal den ganzen Code von der Install Klasse.

Wk

edith: Dabei stellt sich mir die Frage ob das ein Applet ist, dass du ausführst? Hmm versucht er die Datei im gepackten Jar des Applets zu lesen und findet das nicht?


----------



## Developer_X (4. Okt 2009)

das ist ne Applikation, hier der ganze code,

```
package Installer;

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.zip.*;

public class Install 
{
	public Install(String s) throws Exception
	{
        String server = "http://www.sssjdxsss.kilu.de/";
        URL url = new URL(server + s+".zip");

        final int BUFFER_MAX = 0xFFFF;
        
        byte[] buffer = new byte[BUFFER_MAX];
        String filename = s+".zip";
        BufferedInputStream in = new BufferedInputStream(url.openStream());
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(filename));
        for (int len; (len = in.read(buffer)) != -1; ) 
        {
            out.write(buffer, 0, len);
        }
        in.close();
        out.close();
        
        extractZipFile(s);
        
        System.out.println("finish");
	}
    @SuppressWarnings("unchecked")
	public void extractZipFile(String s) throws Exception
    {      
        String zipname = s+".zip";
        File F = new File(zipname);
        System.out.println(F.getAbsolutePath());
        ZipFile zipFile = new ZipFile(F.getAbsolutePath());
        Enumeration enumeration = zipFile.entries();
        
        while (enumeration.hasMoreElements()) 
        {
        	ZipEntry zipEntry = (ZipEntry) enumeration.nextElement();
        	System.out.println("Unzipping: " + zipEntry.getName());
        	BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(zipEntry));
          
          	int size;
          	byte[] buffer = new byte[2048];
          	BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipEntry.getName()), buffer.length);
          
         	while ((size = bis.read(buffer, 0, buffer.length)) != -1) 
          	{
         		bos.write(buffer, 0, size);
        	}
        	bos.flush();
        	bos.close();
        	bis.close();
        }
    }
}
```


----------



## Wookie81 (4. Okt 2009)

Die Exception kommt ja in Zeile 49

```
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipEntry.getName()), buffer.length);
```
Hier versuchst du in die Datei Paramecium\Paramecium.jar (die erste Datei aus der zip Datei) zu schreiben und das geht schief.

Kann es sein dass das Verzeichnis Paramecium nicht existiert?

Wk


----------



## Developer_X (5. Okt 2009)

also in dem ordner, wo das Programm ist, ist ein Zip ordner mit dem Namen: Paramecium.zip

verstehst du?
Und ich will aus dem Zip Ordner, alle dateien, die da drin sind, raus extrahieren, also im Klar text: extract all files in the zip!


----------



## Wookie81 (5. Okt 2009)

Hey ja ich versteh tun *scnr*

Wie schon gesagt das Verzeichnis, in welchem die Datei entpackt werden soll, existiert nicht und muss erst angelegt werden. Schreib z.B. statt der oben genannten Zeile einfach:

```
File file = new File(zipEntry.getName());
file.getParentFile().mkdirs();
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file), buffer.length);
```


Wk


----------



## Developer_X (5. Okt 2009)

in meinem zip gibt es einen ordner der heißt sounds,
so und jetzt, kommt diese fehlermeldung, wenn ich deinen code zusätzlich einsetzte

```
F:\RaymanWebpage\XAE\Paramecium.zip
Unzipping: Paramecium/Paramecium.jar
Unzipping: Paramecium/Run.bat
Unzipping: Paramecium/sounds/
Unzipping: Paramecium/sounds/hover.WAV
java.io.FileNotFoundException: Paramecium\sounds\hover.WAV (Das System kann den angegebenen Pfad nicht finden)
	at java.io.FileOutputStream.open(Native Method)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at Installer.Install.extractZipFile(Install.java:51)
	at Installer.Install.<init>(Install.java:28)
	at XAE.Data$1.mouseClicked(Data.java:46)
	at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```

Muss man für jeden ordner in der zip, einen ordner erstellen?
Also das glaube ich ja wohl nciht.


----------



## Wookie81 (5. Okt 2009)

Developer_X hat gesagt.:


> Muss man für jeden ordner in der zip, einen ordner erstellen?
> Also das glaube ich ja wohl nciht.


Äh doch? Wenn nicht du, wer dann? Aber eigentlich sollte das automatisch passieren, wenn du meinen Code an der passenden Stelle eingefügt hast ...


----------



## Developer_X (6. Okt 2009)

also so siehts in der zip aus:

Paramecium.jar
sounds/
      Sound1.wav
      Sound2.wav

Der Code sieht so aus:

```
package Installer;

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.zip.*;

public class Install 
{
	public Install(String s) throws Exception
	{
        String server = "http://www.sssjdxsss.kilu.de/";
        URL url = new URL(server + s+".zip");

        final int BUFFER_MAX = 0xFFFF;
        
        byte[] buffer = new byte[BUFFER_MAX];
        String filename = s+".zip";
        BufferedInputStream in = new BufferedInputStream(url.openStream());
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(filename));
        for (int len; (len = in.read(buffer)) != -1; ) 
        {
            out.write(buffer, 0, len);
        }
        in.close();
        out.close();
        
        extractZipFile(s);
        
        System.out.println("finish");
	}
    @SuppressWarnings("unchecked")
	public void extractZipFile(String s) throws Exception
    {      
        String zipname = s+".zip";
        File F = new File(zipname);
        System.out.println(F.getAbsolutePath());
        ZipFile zipFile = new ZipFile(F.getAbsolutePath());
        Enumeration enumeration = zipFile.entries();
        
        while (enumeration.hasMoreElements()) 
        {
        	ZipEntry zipEntry = (ZipEntry) enumeration.nextElement();
        	System.out.println("Unzipping: " + zipEntry.getName());
        	BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(zipEntry));
          
          	int size;
          	byte[] buffer = new byte[2048];
          	File file = new File(zipEntry.getName());
          	file.getParentFile().mkdirs();
          	BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipEntry.getName()), buffer.length);
          
         	while ((size = bis.read(buffer, 0, buffer.length)) != -1) 
          	{
         		bos.write(buffer, 0, size);
        	}
        	bos.flush();
        	bos.close();
        	bis.close();
        }
    }
}
```


----------



## Wookie81 (6. Okt 2009)

Zeile 50 ersetzen mit

```
if (zipEntry.isDirectory()) {
   file.mkdirs();
} else {
   file.getParentFile().mkdirs();
}
```

Muss dir aber recht geben ist alles ziemlich umständlich, aber so ist programmieren nun manchmal.

Wk


----------



## Developer_X (7. Okt 2009)

danke, aber ein Problem hat der jetzt noch, er erstellt zwar den ordner sounds, aber dann wird ihm der zugriff darauf verweigert, sodass er keine Dateien in den Ordner sounds speichern kann, leider.


```
F:\RaymanWebpage\XAE\Paramecium.zip
Unzipping: Paramecium/Paramecium.jar
Unzipping: Paramecium/Run.bat
Unzipping: Paramecium/sounds/
java.io.FileNotFoundException: Paramecium\sounds (Zugriff verweigert)
	at java.io.FileOutputStream.open(Native Method)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at Installer.Install.extractZipFile(Install.java:58)
	at Installer.Install.<init>(Install.java:28)
	at XAE.Data$1.mouseClicked(Data.java:46)
	at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```

Code

```
package Installer;

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.zip.*;

public class Install 
{
	public Install(String s) throws Exception
	{
        String server = "http://www.sssjdxsss.kilu.de/";
        URL url = new URL(server + s+".zip");

        final int BUFFER_MAX = 0xFFFF;
        
        byte[] buffer = new byte[BUFFER_MAX];
        String filename = s+".zip";
        BufferedInputStream in = new BufferedInputStream(url.openStream());
        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(filename));
        for (int len; (len = in.read(buffer)) != -1; ) 
        {
            out.write(buffer, 0, len);
        }
        in.close();
        out.close();
        
        extractZipFile(s);
        
        System.out.println("finish");
	}
    @SuppressWarnings("unchecked")
	public void extractZipFile(String s) throws Exception
    {      
        String zipname = s+".zip";
        File F = new File(zipname);
        System.out.println(F.getAbsolutePath());
        ZipFile zipFile = new ZipFile(F.getAbsolutePath());
        Enumeration enumeration = zipFile.entries();
        
        while (enumeration.hasMoreElements()) 
        {
        	ZipEntry zipEntry = (ZipEntry) enumeration.nextElement();
        	System.out.println("Unzipping: " + zipEntry.getName());
        	BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(zipEntry));
          
          	int size;
          	byte[] buffer = new byte[2048];
          	File file = new File(zipEntry.getName());
          	if (zipEntry.isDirectory()) 
          	{
          	   file.mkdirs();
          	} 
          	else 
          	{
          	   file.getParentFile().mkdirs();
          	}          	
          	BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipEntry.getName()), buffer.length);
         	while ((size = bis.read(buffer, 0, buffer.length)) != -1) 
          	{
         		bos.write(buffer, 0, size);
        	}
        	bos.flush();
        	bos.close();
        	bis.close();
        }
    }
}
```


----------



## Wookie81 (7. Okt 2009)

Welches OS?


----------



## Developer_X (8. Okt 2009)

Ich glaube du meinst mit OS, das betriebsystem.

Ich verwende Windows Vista.


----------



## bygones (8. Okt 2009)

Wookie81 hat gesagt.:


> Zeile 50 ersetzen mit
> 
> ```
> if (zipEntry.isDirectory()) {
> ...



diese unterscheidung ist nicht notwendig

mkdirs erstellt schon das file mit allen noetigen Parentverzeichnissen.


----------



## Developer_X (8. Okt 2009)

ok, aber kannst du mir bitte bei meinem Problem helfen?


----------



## Wookie81 (8. Okt 2009)

bygones hat gesagt.:


> diese unterscheidung ist nicht notwendig
> 
> mkdirs erstellt schon das file mit allen noetigen Parentverzeichnissen.


Also als ich es bei mir ausprobiert habe, hatte ich das Problem das er für "Ordner/Datei.xyz" die beiden (!) Verzeichnisse "Ordner" und "Datei.xyz" erstellt?!



Developer_X hat gesagt.:


> ok, aber kannst du mir bitte bei meinem Problem helfen?


Das Problem ist dein Programm nicht die passende Berechtigung hat. Mit Vista Berechtigungen kenne ich mich nur begrenzt aus, aber als welcher User/wie führst du dein Java Programm aus? Hat der ausreichend Berechtigungen? Wird das erste Verzeichnis (Paramecium) korrekt angelegt (vorher mal testweise löschen)?

Wk


----------



## Gast2 (9. Okt 2009)

Bei Vista gibt es einer Benutzerkonsole die den Benutzer jedes mal frägt ob er etwas ausführen darf, bei dir ist das der kopiervorgang. Das kannst du irgendwo bei der Firewall ausschalten... Keine Ahung wie es genau heißt musst goggeln irgendwas mit Benutzerkonsole oder so


----------



## Developer_X (9. Okt 2009)

ich starte das ganze momentan noch in eclipse, aber ich bin admin meines PCs, außerdem, wenn er die Dateien kopieren und am PC abspeichern kann, was ist dann daran so schlimm, dass er auch noch ein Unterverzeichnis erstellt?!


----------



## Gast2 (9. Okt 2009)

was hat das damit zu zu tun??? egal was du bist stell einfach die konsole aus fertig


----------

