java提取zip ZLIB输入流意外结束

vql8enpb  于 2023-01-29  发布在  Java
关注(0)|答案(4)|浏览(227)

我正在创建一个程序,它将解压缩一个zip,然后将文件插入到数据库中,每隔一段时间我就会得到错误

java.lang.Exception: java.io.EOFException: Unexpected end of ZLIB input stream

我不能找出原因,因为提取代码是几乎相同的所有其他代码,你可以在网上找到。我的代码如下:

public void extract(String zipName, InputStream content) throws Exception {

    int BUFFER = 2048;

    //create the zipinputstream 
    ZipInputStream zis = new ZipInputStream(content);

    //Get the name of the zip
    String containerName = zipName;

    //container for the zip entry
    ZipEntry entry;

    // Process each entry
    while ((entry = zis.getNextEntry()) != null) {

        //get the entry file name
        String currentEntry = entry.getName();

        try {

                ByteArrayOutputStream baos = new ByteArrayOutputStream();

                // establish buffer for writing file
                byte data[] = new byte[BUFFER];
                int currentByte;

                // read and write until last byte is encountered
                while ((currentByte = zis.read(data, 0, BUFFER)) != -1) {

                    baos.write(data, 0, currentByte);
                }

                baos.flush(); //flush the buffer 

                //this method inserts the file into the database
                insertZipEntry(baos.toByteArray());

                baos.close();

        } 
        catch (Exception e) {
            System.out.println("ERROR WITHIN ZIP " + containerName);
        }
    }
}
ki0zmccv

ki0zmccv1#

这可能是由于JVM bug (JVM-6519463)
我以前在1000个随机创建的文档上有一两个错误,我应用了建议的解决方案(捕获EOFException,不做任何操作),没有更多的错误。

idv4meu8

idv4meu82#

我会说你偶尔会被截断的Zip文件处理。检查上游。

to94eoyn

to94eoyn3#

我遇到了同样的异常,问题出在压缩方法(不是提取)上。在写入输出流后,我没有使用zos.closeEntry()关闭ZipOutputStream。如果没有zos.closeEntry(),压缩工作正常,但在提取时出现了异常。

public static byte[] zip(String outputFilename, byte[] output) {
    try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
         ZipOutputStream zos = new ZipOutputStream(baos)) {
        zos.putNextEntry(new ZipEntry(outputFilename));
        zos.write(output, 0, output.length);            
        zos.closeEntry(); //this line must be here
        return baos.toByteArray();
    } catch (IOException e) {
        //catch exception
    }
}
zdwk9cvp

zdwk9cvp4#

不要尝试读取超过条目所包含的字节数。调用ZipEntry.getSize()来获取条目的实际大小,然后使用此值来跟踪条目中剩余的字节数,同时阅读条目。请参阅以下内容:

try{    

   ...

   int bytesLeft = (int)entry.getSize();
   while ( bytesLeft>0 && (currentByte=zis.read(data, 0, Math.min(BUFFER, bytesLeft))) != -1) {
     ...
  }

  ...

  }

相关问题