zip entpacken

MiRaMC

Erfahrenes Mitglied
Hallo Leute

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

thx
 
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
 
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?
 
Allerdings funktioniert der Code nicht mit Unterordnern im Archiv oder täusch ich mich da mal wieder?
 
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?
 
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
 
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ß (!)
 
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
 
Zurück