2011-08-22 67 views
3

我想提取一個普通的zip文件,但它保持失敗。 這是我的代碼,我現在使用:解壓zip文件給出「java.util.zip.ZipException:無法讀取版本」或「java.util.ZipException無法讀取本地頭版本45」

private File downloadPath = new File(Environment.getExternalStorageDirectory() + "/Test/file.zip"); 
private File unzipLoc = new File(Environment.getExternalStorageDirectory() + "/Test/"); 
     FileInputStream fin = new FileInputStream(downloadPath); 
     ZipInputStream zin = new ZipInputStream(fin); 
     ZipEntry ze = null; 
     while ((ze = zin.getNextEntry()) != null) 
     { 
      FileOutputStream fout = new FileOutputStream(unzipLoc + ze.getName()); 
      for (int c = zin.read(); c != -1; c = zin.read()) 
      { 
       fout.write(c); 
      } 

      zin.closeEntry(); 
      fout.close(); 
     } 
     zin.close(); 

它未能在「zin.getNextEntry()」的一部分。 錯誤:java.util.zip.ZipException:無法讀取版本 任何想法?謝謝!

+0

聽起來像您的ZIP文件無效。 – SLaks

回答

5

看起來你的zip文件比你的'解壓縮庫'更新。

如果你讀了源:

ZipInputStream(搜索拋出:ZipException新( 「無法讀取版本」)

它顯示了它檢查的zip文件版本。然後看Wikipedia它顯示這是提取zip所需的最低版本。

檢查您的zip文件,並將其與你的拉鍊軟件的較低版本重新保存/無壓縮壓縮再它來測試

或者更新您的郵編庫(你不能做你的作爲使用內部的Android zip庫)。

+0

我現在注意到我的文件是zip64。我怎樣才能將其轉換爲正常的zip文件?或者如何在android中讀取這些文件? – FireWall

+1

zip64是我失敗的原因,我在Android的Appcelerator中使用壓縮模塊 – Markive

+2

我正在使用SharpZipLib來創建zip,這是設置頭版本爲45.我設置ZipOutputStream.UseZip64 = UseZip64.Off 。之後,在Android上解壓沒有問題。 –

4

只需添加上述問題解決方案的答案,以及爲什麼在我的情況下創建。是特別感謝班格先生和布倫戴爾先生幫助我們迅速理解和解決問題。

我在解壓縮SD卡上的文件時,遇到了此異常,指出「java.util.ZipException無法讀取本地頭版本45」。該zip文件是從DOT NET服務器下載的,服務器使用SharpZipLib庫來解壓縮這些文件。從例外情況來看,這顯然意味着壓縮和解壓縮庫有不同的版本。

解決方案:

基本上SharpZipLib使用ZIP64(zip文件格式的擴展格式來壓縮文件)哪個是不符合java.util.zip包在機器人和上的Java的可用庫釋放前7

因此,如果您在壓縮文件的服務器上切換Zip64,那麼它將與android java.util.zip軟件包兼容,並且很容易解壓縮。如果您在服務器上添加以下行,它將解決您的問題:

ZipOutputStream.UseZip64 = UseZip64.Off 
+0

如果我們無法控制文件如何壓縮,該怎麼辦?有什麼建議麼? – alpinescrambler