# ZIP on the Fly entpacken



## wraith07 (6. November 2009)

Hallo Leute,
ich habe da folgendes Problem. Und zwar muss ich ein Zip Archiv von einer URL
runterladen.
Soweit OK.


```
URL url = new URL(inurl);
InputStream instr = url.openStream();
System.out.println(url.getProtocol()+": "+url.getHost()+url.getPath());
ZipInputStream inzip = new ZipInputStream(instr);
```

Um mir nun die Arbeit zu erleichetern habe ich hier im Forum
das gefunden:
http://www.tutorials.de/forum/java/215919-zip-entpacken.html

Mit Hilfe diese Beispiels bin ich sweit gekommen,
dass ich die Verzeichnisstruktur aus dem Archiv bekomme und diese auf die
Platte schreibe.

Problem gibt es aber bei den einzelnen Dateien im Archiv,
die bekomme ich nicht geschrieben.

Hilfe........


----------



## zerix (6. November 2009)

Hallo,

was genau funktioniert denn nicht?
Kommt eine Fehlermeldung?

Zeigst du mal den Code?

Gruß

Sascha


----------



## wraith07 (11. November 2009)

zerix hat gesagt.:


> Hallo,
> 
> was genau funktioniert denn nicht?
> Kommt eine Fehlermeldung?
> ...



hallo,
meine problem besteht darin, dass ich aktuell wie im beispiel
http://www.tutorials.de/forum/java/215919-zip-entpacken.html
vorgehe.

ich hole mir über die url ein zip file und entpacke dieses sogleich in ein verzeichnis,
hierbei umss ich leider das zip file in einer tmp datei ablegen.
das möchte ich umgehen und nur über stream arbeiten.


----------



## Thomas Darimont (11. November 2009)

Hallo,

schau mal hier:

```
package de.tutorials;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.channels.Channels;
import java.util.Iterator;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import com.google.common.collect.AbstractIterator;

public class ZipArchiveExtractor {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {

        File destDir = new File("/tmp/goog.collect.src");

        final ZipInputStream zipIn = new ZipInputStream(new URL("http://localhost:8000/src-1.0-rc3.zip").openStream());

        Iterator<? extends ZipEntry> zipEntries = new AbstractIterator<ZipEntry>() {
            @Override
            protected ZipEntry computeNext() {
                ZipEntry next = null;
                try {
                    next = zipIn.getNextEntry();
                    if (next == null) {
                        next = endOfData();
                    }
                } catch (IOException e) {
                    next = endOfData();
                }
                return next;
            }
        };

        while (zipEntries.hasNext()) {
            ZipEntry zipEntry = zipEntries.next();
            String entryName = zipEntry.getName();

            System.out.println(entryName);
            if (zipEntry.isDirectory()) {
                File dir = new File(destDir, entryName);
                if (!dir.exists()) {
                    if (!dir.mkdirs()) {
                        throw new RuntimeException("Cannot create directory: " + dir);
                    }
                }
            } else {

                FileOutputStream fos = null;
                try {
                    File file = new File(destDir, entryName);
                    System.out.println(file);
                    fos = new FileOutputStream(file);
                    fos.getChannel().transferFrom(Channels.newChannel(zipIn), 0, zipEntry.getSize());
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (fos != null) {
                        fos.close();
                    }
                }
            }

            zipIn.closeEntry();
        }
        zipIn.close();

    }
}
```

Gruß Tom


----------



## wraith07 (11. November 2009)

ja vielen dank,
finde aber

com.google.common.collect.AbstractIterator

nicht  zum runterlade


----------



## wraith07 (11. November 2009)

hi tom,
ja dank klapp bis auf die kleinigkeit,
dass die entpackten dateien leer sind.


----------



## Thomas Darimont (11. November 2009)

Hallo,

seltsam bei mir funktioniert das so einwandfrei (Ubuntu Linux 9.10 / OpenJDK 1.6, 1.6.0_0-b16)  ... haben die Daten denn überhaupt Inhalt, wenn du das Zip Archiv von der Quelle manuell  runterlädst?

Gruß Tom


----------



## wraith07 (11. November 2009)

hallo tom,
bei mir sieht die quelle "url" wie folgt aus

"http://pgrc-35.ipk-gatersleben.de/bfiler-web/BFileDownloadServlet?table_name=gcc_images&pk_column=tab_id&pk_value=6,12,34,1,2,3,55,66,1,2,3,4,5,7,8,9,10&bfile_column=thumbs&calling_user=GCC"

die entsprechende zip datei wird mittels eines servlets erzeug.........

das beispiel
http://www.tutorials.de/forum/java/215919-zip-entpacken.html

funktioniert.


----------



## wraith07 (11. November 2009)

hi tom,
ich habe es mit einigen änderungen hin bekommen.

```
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import com.google.common.collect.AbstractIterator;

public class LimsZipExtractor{
	
	public LimsZipExtractor(String inurl) throws MalformedURLException, IOException{
	   extract(inurl);
	};
	
	private void extract(String inurl) throws MalformedURLException, IOException{
		File destDir = new File("u:/test/"); // noch weg 
        byte[] buffer = new byte[16384];
        final ZipInputStream zipIn = new ZipInputStream(new URL(inurl).openStream());
 
        Iterator<? extends ZipEntry> zipEntries = new AbstractIterator<ZipEntry>() {
            protected ZipEntry computeNext() {
                ZipEntry next = null;
                try {
                    next = zipIn.getNextEntry();
                    if (next == null) {
                        next = endOfData();
                    }
                } catch (IOException e) {
                    next = endOfData();
                }
                return next;
            }
        };
 
        while (zipEntries.hasNext()) {
            ZipEntry zipEntry = zipEntries.next();
            String entryName = zipEntry.getName();
 
            System.out.println(entryName);
            if (zipEntry.isDirectory()) {
                File dir = new File(destDir, entryName);
                if (!dir.exists()) {
                    if (!dir.mkdirs()) {
                        throw new RuntimeException("Cannot create directory: " + dir);
                    }
                }
            } else {
 
                BufferedOutputStream bos = new BufferedOutputStream(
						new FileOutputStream(new File(destDir, entryName)));

				
				int len =0;
				BufferedInputStream bis = new BufferedInputStream(zipIn);
				while ((len = bis.read(buffer)) != -1) {
					bos.write(buffer, 0, len);
				}
				bos.close();
				zipIn.closeEntry();
            }
        } ; 
		
	};
```


----------



## wraith07 (13. November 2009)

hallo,
leider noch eine frage,
wie bekomme ich heraus wiele entries im stream sind


```
int count=0;
        while(zipIn.getNextEntry() !=null){
        	count++;
        	
        }
        System.out.println(count);
```

macht nur eine endlosschleife.......


----------

