0

当我尝试解压缩大约 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(); 
    }
   }   
} 

编辑: zip 是有效的测试与 7zip 和 windows 解压缩两者

4

3 回答 3

0

我不知道这是否适用,我会提供它的价值——我一次以编程方式解压缩大文件,并在解压缩类中发现了一个错误。它很深,但是堆栈跟踪最终将我带到了那里-我记得它与使用缓冲区有关,并且在输入要解压缩的整个字节块之前错误地处理了诸如填充缓冲区之类的事情.

但是这个信息很旧,我不记得我使用的是哪个库,它可能不适用。我通过在使用前解压缩所有需要的文件来解决它,所以我没有密切关注它。

于 2013-08-20T21:05:05.957 回答
0

我相信您的问题是您正在使用超类中的read()方法FilterInputStreamZipInputStream有一个方法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)它可能对解压缩数据或尊重条目边界一无所知。

于 2013-08-20T20:19:18.433 回答
0

zip 文件中的所有文件都是非空的吗?我的猜测是其中一个 zip 条目的文件大小为 0。

像这样添加检查以查看是否有字节要读取到 while 循环中(警告未测试)可能有效:

 while (zis.available() >0 && (len = zis.read(buffer)) > 0) {
于 2013-08-20T19:09:00.870 回答