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

时间:2013-08-20 18:36:20

标签: 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 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解压缩

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我不知道这是否适用,我会提供它的价值 - 我一次以编程方式解压缩大文件,并在解压缩类中发现了一个错误。它非常深,但是堆栈跟踪最终导致了我 - 我记得它与使用缓冲区和错误处理类似填充缓冲区之类的东西之前已经输入整个要解压缩的字节块

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