2012-12-10 58 views
5

我遇到了java.util.zip一個奇怪的行爲檔案。*ZipFile中拋出錯誤,但ZipInputStream能夠解壓縮

我有一個zip文件,解壓後follwing tihngs發生

ZipFile zipfile = new ZipFile(file, ZipFile.OPEN_READ); 

這是exaxt錯誤信息

java.util.zip.ZipException: error in opening zip file 
at java.util.zip.ZipFile.open(Native Method) 
at java.util.zip.ZipFile.<init>(ZipFile.java:127) 
at java.util.zip.ZipFile.<init>(ZipFile.java:143) 
at com.basware.ExtractZip.unpack(ExtractZip.java:27) 
at com.basware.ExtractZip.main(ExtractZip.java:17) 

但是,如果使用下面的代碼就可以打開歸檔沒有任何錯誤

try { 
    BufferedOutputStream dest = null;  
    File file = new File("File_Path");   
    FileInputStream fis = new FileInputStream(file); 
    ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 
    ZipEntry entry; 
    while((entry = zis.getNextEntry()) != null) { 
     System.out.println("Extracting: " +entry); 
     int count; 
     byte data[] = new byte[BUFFER]; 
     // write the files to the disk 
     FileOutputStream fos = new 
     FileOutputStream(entry.getName()); 
     dest = new 
      BufferedOutputStream(fos, BUFFER); 
     while ((count = zis.read(data, 0, BUFFER)) 
      != -1) { 
      dest.write(data, 0, count); 
     } 
     dest.flush(); 
     dest.close(); 
    } 
    zis.close(); 

請注意,使用WinZIP壓縮文件。

我的問題是這樣的ZipFile和ZipInputStream幾乎是一樣的,爲什麼ZipFile的是給予例外,爲什麼它不能執行解壓縮。

編輯:問題是如果我使用WinZip工具壓縮文件,然後使用列出的程序解壓縮它工作的很好。但是,這個問題是專門爲來自外部源(外部源聲明,他們正在使用WinZip)。最重要的是,如果我使用WinZip工具打開相同的壓縮文件(外部壓縮文件),它將顯示並解壓文件。但是這個JAVA特定的代碼(ZipFile)根本不起作用。

編輯:我無法弄清楚爲什麼java本地代碼不能用於我的ZIP存檔,但apache壓縮解決了我的問題。它正在爲Ian Roberts所建議的工作。

回答

4

ZipFile試圖分析在拉鍊結束了「中央目錄」,以建立一個數據結構,它允許您通過名稱來訪問各個條目。 ZipInputStream不是,它只是在從上到下讀取文件時查看每個條目的本地標題。所以它看起來像你的文件有很好的條目,但出於某種原因損壞了中央目錄。

有許多的可能性,例如問題與encoding of non-ASCII characters in entry names,或者,如果拉鍊已超過64K的條目。我會嘗試ZipFile的commons-compress實現 - 即使它不起作用,它應該給你一個更具體的錯誤信息,而不是你從java.util.zip得到的「有問題」。

+0

我已添加錯誤消息。 – C4CodeE4Exe

+1

@ C4CodeE4Exe這是Java中部分本地zip實現的問題之一,它的錯誤消息並不是非常有用......我添加了一些更多的想法。 –

+0

我嘗試使用org.apache.commons.compress.archivers.zip.ZipFile,它能夠給我看的條目,而不是errors.But有些者除外沒有GetName方法,項目已更名爲getEntries,getEntries和getEntry返回org.apache.commons.compress.archivers.zip.ZipArchiveEntry實例,close可以拋出IOException。 – C4CodeE4Exe

0

除了Ian Robert的回答,如果Java 7是一個選項,您可能希望避開較舊的java.util.zip庫,轉而使用the ZIP filesystem provider

+0

對不起。我們沒有使用Java 7 – C4CodeE4Exe