解压zip文件给出“java.util.zip.ZipException:无法读取版本”或“java.util.ZipException无法读取本地头版本45”

问题描述:

我想提取一个普通的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

看起来你的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上解压没有问题。 –

只需添加上述问题解决方案的答案,以及为什么在我的情况下创建。是特别感谢班格先生和布伦戴尔先生帮助我们迅速理解和解决问题。

我在解压缩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