使用java解压缩代码解压缩错误java.io.EOFException

使用java解压缩代码解压缩错误java.io.EOFException,java,unzip,Java,Unzip,当我尝试解压一个大约56MB的大zip文件时,我遇到了这个错误。对于较小的zip文件,它可以正常工作。对java还是新手,所以请对我放松点 java.io.EOFException: Unexpected end of ZLIB input stream at java.util.zip.InflaterInputStream.fill(Unknown Source) at java.util.zip.InflaterInputStream.read(Unknown Source) at jav

当我尝试解压一个大约56MB的大zip文件时,我遇到了这个错误。对于较小的zip文件,它可以正常工作。对java还是新手,所以请对我放松点

java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(Unknown Source)
at java.util.zip.InflaterInputStream.read(Unknown Source)
at java.util.zip.ZipInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at UnZip.unZipIt(UnZip.java:62)
at UnZip.main(UnZip.java:23)
我使用的代码给出了以下信息:

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;





public class UnZip
{
    List<String> fileList;
    private static final String INPUT_ZIP_FILE = "PAQ-Temp/Downloads/mods.zip";
    private static final String OUTPUT_FOLDER = "PAQ-Temp/images";

    public static void main( String[] args )
    {
        UnZip unZip = new UnZip();
        unZip.unZipIt(INPUT_ZIP_FILE,OUTPUT_FOLDER);
    }


      //Unzip it
      //@param zipFile input zip file
      //@param output zip file output folder

    public void unZipIt(String zipFile, String outputFolder){

    byte[] buffer = new byte[104512585];

     try{

        //create output directory is not exists
        File folder = new File(OUTPUT_FOLDER);
        if(!folder.exists()){
            folder.mkdir();
        }

        //get the zip file content
        ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile));
        //get the zipped file list entry
        ZipEntry ze = zis.getNextEntry();

        while(ze!=null){

           String fileName = ze.getName();
           File newFile = new File(outputFolder + File.separator + fileName);

           System.out.println("file unzip : "+ newFile.getAbsoluteFile());

            //create all non exists folders
            //else you will hit FileNotFoundException for compressed folder
            new File(newFile.getParent()).mkdirs();

            FileOutputStream fos = new FileOutputStream(newFile);             

            int len;
            while ((len = zis.read(buffer)) > 0) {
            fos.write(buffer, 0, len);
            }

            fos.close();   
            ze = zis.getNextEntry();
        }

        zis.closeEntry();
        zis.close();

        System.out.println("Done unziping");

    }catch(IOException ex){
       ex.printStackTrace(); 
    }
   }   
} 
import java.io.BufferedOutputStream;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.util.List;
导入java.util.zip.ZipEntry;
导入java.util.zip.ZipInputStream;
公共类解压
{
列表文件列表;
私有静态最终字符串输入\u ZIP\u FILE=“PAQ Temp/Downloads/mods.ZIP”;
私有静态最终字符串输出\u FOLDER=“PAQ Temp/images”;
公共静态void main(字符串[]args)
{
解压解压=新解压();
解压(输入文件,输出文件夹);
}
//解开它
//@参数zipFile输入zip文件
//@param输出zip文件输出文件夹
public void unZipIt(字符串zipFile、字符串outputFolder){
字节[]缓冲区=新字节[104512585];
试一试{
//创建输出目录不存在
文件夹=新文件(输出文件夹);
如果(!folder.exists()){
folder.mkdir();
}
//获取zip文件内容
ZipInputStream zis=新的ZipInputStream(新文件输入流(zipFile));
//获取压缩文件列表条目
ZipEntry ze=zis.getNextEntry();
while(ze!=null){
字符串文件名=ze.getName();
File newFile=新文件(outputFolder+File.separator+fileName);
System.out.println(“文件解压缩:+newFile.getAbsoluteFile());
//创建所有不存在的文件夹
//否则,您将点击压缩文件夹的FileNotFoundException
新文件(newFile.getParent()).mkdirs();
FileOutputStream fos=新FileOutputStream(新文件);
内伦;
而((len=zis.read(buffer))>0){
fos.写入(缓冲区,0,len);
}
fos.close();
ze=zis.getnextery();
}
zis.closeEntry();
zis.close();
System.out.println(“完成解压”);
}捕获(IOEX异常){
例如printStackTrace();
}
}   
} 
编辑:
使用7zip和windows解压测试zip是否有效压缩文件中的所有文件都是非空的吗?我猜其中一个zip条目的文件大小为0

添加检查以查看是否有这样的字节可读取到while循环(警告未测试)可能会起作用:

 while (zis.available() >0 && (len = zis.read(buffer)) > 0) {

我相信您的问题在于您正在使用
FilterInputStream
超类中的
read()
方法
ZipInputStream
有一个方法
read(byte[]buffer,int offset,int length)
,您应该使用该方法:

while ((len = zis.read(buffer,0,buffer.length)) > 0) {
    fos.write(buffer, 0, len);
}

由于
ZipinputStream
不会覆盖
FilterInputStream#read(byte[]buffer)
它可能对解压缩数据或尊重条目边界一无所知。

我不知道这是否适用,我将提供它的价值——我曾以编程方式解压缩大型文件,但在解压缩类中发现了一个bug。它相当深,但堆栈跟踪最终引导我到了那里——我记得它与使用缓冲区和错误处理有关,比如在输入要解压缩的整个字节块之前填充缓冲区


但是这个信息是旧的,我不记得我使用的是哪个库,它可能不适用。我在使用之前解压了所有需要的文件,解决了这个问题,所以我没有严格遵循它。

zip文件本身是否确实有效?你为什么要用这么大的缓冲区?(如果是的话,我会使用~32K…)堆栈跟踪显示错误在第62行。这是哪一个?通过使用winzip或其他工具解压来检查大zip是否有效,我还建议将外部while循环
while(ze!=null)
更改为
while((ze=zis.getnextery())!=null)
并进行相关更改。是的,zip是有效的,我用7zip打开对其进行了测试。它是如此大的缓冲区的原因是我试图确定缓冲区是否是问题所在,即第62行中zip的确切文件大小为“while((len=zis.read(buffer))>0”{zip中的所有文件都是非空的,添加检查不会改变任何内容