# Java Zip Extrahieren



## FutureDesign (17. November 2016)

Hallo ich bin gerade dabei einen Autoupdater zu schreiben und dabei wird das gedownloadete ZIP-Archiv in den Programm Files Ordner entpackt. Dabei tritt nur leider immer der folgende Fehler auf:

```
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:

```
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);
    }
}
```


----------



## HonniCilest (17. November 2016)

Laut Doku ist ein Leseberechtigungs-Fehler auszuschließen, denn dann wäre es eine IO-Exception. Per Default wird das zip-File mit UTF-8 Charset geöffnet, eventuell ist aber ein anderes Charset notwendig?


----------



## FutureDesign (17. November 2016)

Was würdest du sagen, welches charset das sein könnte oder wie ich das rausfinden kann?


----------



## HonniCilest (17. November 2016)

Weißt du auf welchem Betriebssystem das zip erstellt wurde?
Versuche mal ISO-8859-1 (oft bei Linux)
oder Cp1252 (Default Windows)


----------



## FutureDesign (17. November 2016)

Ja wurde auf Windows erstellt. Ich finde jedoch keine Möglichkeit, wie ich den Charset beim Einlesen ändern kann.
Hast du da eine Idee?


----------



## HonniCilest (17. November 2016)

*ZipFile*(File file, Charset charset)
Opens a ZIP file for reading given the specified File object.

Im Konstruktor angeben


----------



## FutureDesign (17. November 2016)

Ah ok sorry da hatte ich nicht geguckt.
Danke


----------

