簡體   English   中英

解壓縮Java中導致“ java.util.zip.ZipException”的zip文件-無效的LOC標頭(錯誤的簽名)

[英]Unpacking zip files in Java that cause a “java.util.zip.ZipException” - invalid LOC header (bad signature)

我有一個zip文件 (從ownCloud實例下載),無法使用java.util.zip中的Java庫(java版本“ 1.8.0_66”)解壓縮。 如果我嘗試這樣做,則會引發以下異常:

java.util.zip.ZipException: invalid LOC header (bad signature)

發出Linux“文件”命令時,它輸出以下內容:

so-example.zip: Zip archive data, at least v3.0 to extract

經過一番嘗試和錯誤后,我發現應該由Java v2.0處理的文件“ v2.0”無法將其解壓縮。

以下是用於解壓縮的代碼的最小示例:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class PlaygroundZip{
    public static void main(String[] args) {
        String filename = "/tmp/so-example.zip";
        byte[] buffer = new byte[1024];

        try {
            ZipFile zipFile = new ZipFile(filename);
            Enumeration entries = zipFile.entries();
            while(entries.hasMoreElements()) {
                ZipEntry entry = (ZipEntry)entries.nextElement();
                String currName = entry.getName();

                System.out.println("File: " + currName);

                if(entry.isDirectory()) {
                    new File(currName).mkdirs();
                } else{
                    InputStream zis = zipFile.getInputStream(entry);
                    FileOutputStream fos = new FileOutputStream(currName);             

                    int len;
                    while ((len = zis.read(buffer)) > 0) {
                        fos.write(buffer, 0, len);
                    }
                    fos.close();  
                }
            }
            zipFile.close();
        } catch (IOException ioe) {
            System.err.println("Unhandled exception:");
            ioe.printStackTrace();
        }

    }
}

如何使用標准Java庫或任何其他方法處理這些文件?

到目前為止,我發現解壓縮這些文件的唯一方法是使用系統命令並使用“ unzip”命令行工具(Ubuntu 12.04 LTS,UnZip 6.00)。 由於這是在服務器應用程序中使用的,因此即使不是很優雅,也可以接受。

Process p = Runtime.getRuntime().exec("unzip " + filename + " -d /tmp/mydir");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM