zip entpacken

MiRaMC

Erfahrenes Mitglied
#1
Hallo Leute

Wie kann man ein zip-Archiv in ein bestimmtes Verzeichniss entpacken? Das Archiv enthält mehrere Ordner mit Unterordnern.

thx
 
#2
Hallo!

Schau mal hier:
Code:
 package de.tutorials;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class ZipArchiveExtractor {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		new ZipArchiveExtractor().extractArchive(new File(
				"s:/tools/eclipse/plugins/com.ibm.icu_3.4.4.1.jar"), new File(
				"c:/tmp/x"));
	}

	public void extractArchive(File archive, File destDir) throws Exception {
		if (!destDir.exists()) {
			destDir.mkdir();
		}

		ZipFile zipFile = new ZipFile(archive);
		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 = 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();
			}
		}
                zipFile.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);
	}
}
//Edit: kleine korrektur so sollte es funktionieren.

Gruß Tom
 

MiRaMC

Erfahrenes Mitglied
#3
Hallo erst mal danke für die schnelle Antwort.

Versteh ich das richtig, dass

public void extractArchive(File archive, File destDir) throws Exception {
...
}

die Methode fürs entpacken ist?
Wie ruft man die dann mit den richtigen Angaben für das zip-Archiv und Zielverzeichnis auf?
 

MiRaMC

Erfahrenes Mitglied
#7
Kann man irgendwie noch in den Code reinbringen dass es bei jeder entpackten Datei eine Variable aktualisiert, die enthaltet wieviel Prozent des Archivs schon entpackt sind? Sicher geht das, aber wie?
 

RealHAZZARD

Erfahrenes Mitglied
#8
Tach.

Hab auch schonmal zippen und entzippen gearbeitet, und wollte meine
Benutzer auch eine ProgressBar sehen lassen.
Ich bin zu dem Entschluss gekommen, dass es schon geht, aber nicht sehr
genau ist.
Eine Methode:
Zähle die Verzeichnisse und Dateien in der ersten Ebene und diese nimmst du
dann für deine Prozentrechnung. Wenn es 12 Files sind rechnest du also 100/12.
und mit den 8,33 kannst du dann deine Variable hochticken. Also immer wenn ein
File entpackt wurde zählst du um 8,33 hoch. Und zum Schluss sagst du der Variablen
nochmal explizit "Du hast 100% erreicht".
Die Methode würde ich aber nicht rekursiv anwenden. Das wär zu Performancelastig.
Und so würde es reichen.
Mustt du mal sehen ob dir das recht ist, oder ob Tom ne bessere Lösung hat
 
#9
sollte man nicht vielleicht lieber sofern möglich die Größe der files
in die prozentrechnung einbeziehen als die Anzahl?
Ich mein wenn man son 3gig ding entpackt wäre ja erst 0% und dann auf einmal (nach einiger zeit in der die progressbar auf 0% bleibt) 100% ... 0o
Selbst wenns jetzt nun 12 files wären sind die ja nich alle gleichgroß (!)
 
#10
Hallo zusammen,

funktioniert oben stehender Code auch unter Linux?

Oder muss folgende Zeile dafür verändert werden****?
int lastIndex = entryName.lastIndexOf('/');

Danke und Gruesse
 

genodeftest

Erfahrenes Mitglied
#11
int lastIndex = entryName.lastIndexOf('/');
bezieht sich auf die Struktur innerhalb des ZIP-Archives. Diese ist unabhängig vom Betriebssystem. Der Slash ist das Trennzeichen zwischen internen "ordnern" und "Dateien".
Was du allerdings ändern müsstest, wäre der Pfad zum ZIP-Archiv!
 
#12
Wie immer :D. Genau das was ich suchte. Gewöhn mir schon langsam an, deinen Namen mit in die Suche reinzunehmen. Vielen Dank für all den genialen Code den du der Welt zur Verfügung stellst.
 
#13
Ich bin dabei einen automatischen Updater zu schreiben. Er wirft mir jedoch beim Starten immer diesen Fehler:

Code:
Exception in thread "main" java.util.zip.ZipException: error in opening zip file
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(Unknown Source)
    at java.util.zip.ZipFile.<init>(Unknown Source)
    at java.util.zip.ZipFile.<init>(Unknown Source)
    at de.futuredesign.jframecrator.update.UpdateManager.extractArchive(UpdateManager.java:25)
    at de.futuredesign.jframecrator.update.UpdateManager.startUpdate(UpdateManager.java:14)
    at de.futuredesign.jframecrator.Launcher.main(Launcher.java:33)
Hier mein Code:
Code:
package de.futuredesign.jframecrator.update;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class UpdateManager {
    public static void startUpdate() throws Exception {
        DownloadFile.get("jfc/update/update.zip", System.getProperty("java.io.tmpdir") + "/jfcupdate.zip");
        new UpdateManager().extractArchive(
                new File(System.getProperty("java.io.tmpdir") + "jfcupdate.zip"),
                new File(System.getenv("ProgramFiles") + "/JFrameCreator")
                );
    }
   
    public void extractArchive(File archive, File destDir) throws Exception {
        if (!destDir.exists()) {
            destDir.mkdir();
        }
        ZipFile zipFile = new ZipFile(archive);
        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 = 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();
            }
        }
                zipFile.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);
    }
}
 
#14

Neue Beiträge