2015-11-02 100 views
0

我有zip file(從ownCloud實例下載),無法使用Java庫進行解壓縮(Java版本「1.8.0_66」)來自java.util.zip。如果我嘗試這樣做,下面的異常被拋出:在Java中解壓導致「java.util.zip.ZipException」的zip文件 - 無效的LOC頭(壞簽名)

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

發佈一個Linux的「文件」命令,它輸出以下內容:

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

一些試驗和錯誤後我發現,那些應該是「v2.0」無法定位的文件可以由Java處理,而不會有任何問題。

對用於拆包代碼中的小例子如下:

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庫或任何其他方法這些文件?

回答

0

來解壓縮這些文件的唯一方法,我迄今發現,使用系統命令,並使用「解壓縮」命令行工具(Ubuntu的LTS 12.04,解壓6.00)。由於這是在服務器應用程序中使用,它將是一個可接受的黑客,即使遠離優雅。

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