ZIP on the Fly entpacken

wraith07

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

Code:
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........
 
Hallo,

was genau funktioniert denn nicht?
Kommt eine Fehlermeldung?

Zeigst du mal den Code?

Gruß

Sascha
 
Hallo,

was genau funktioniert denn nicht?
Kommt eine Fehlermeldung?

Zeigst du mal den Code?

Gruß

Sascha

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.
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

schau mal hier:
Java:
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
 
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
 
hi tom,
ich habe es mit einigen änderungen hin bekommen.
Code:
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();
            }
        } ; 
		
	};
 
hallo,
leider noch eine frage,
wie bekomme ich heraus wiele entries im stream sind

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

macht nur eine endlosschleife.......
 
Zurück