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

java提取ZLIB输入流的意外结束,java,Java,我正在创建一个程序,该程序将提取一个zip文件,然后将这些文件插入到一个数据库中,每隔一段时间就会出现一次错误 java.lang.Exception: java.io.EOFException: Unexpected end of ZLIB input stream 我无法找出原因,因为提取代码与您在web上可以找到的所有其他代码几乎相同。我的代码如下: public void extract(String zipName, InputStream content) throws Excep

我正在创建一个程序,该程序将提取一个zip文件,然后将这些文件插入到一个数据库中,每隔一段时间就会出现一次错误

java.lang.Exception: java.io.EOFException: Unexpected end of ZLIB input stream
我无法找出原因,因为提取代码与您在web上可以找到的所有其他代码几乎相同。我的代码如下:

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);
        }
    }
}

切勿尝试读取超过条目包含的字节数。调用ZipEntry.getSize()获取条目的实际大小,然后在读取条目时使用此值跟踪条目中剩余的字节数。见下文:

try{    

   ...

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

  ...

  }

我想说的是,您偶尔会收到截断的Zip文件来处理。检查上游。

这可能是由此引起的


我以前在1000个随机创建的文档上有一个或两个错误,我应用了建议的解决方案(捕获EOFEException并对其不做任何处理),我没有其他错误。

•您是否检查过您尝试处理的压缩流(文件)是否有效(例如,
解压
可以解压)请精确指出实际引发异常的代码行。我可能记不清了,但您不应该在处理完每个条目后关闭它吗?您应该在调用insertZipEntry()之前关闭BAO,我们的“currentByte”变量的名称很糟糕:应该是“count”或类似的名称。您能为您的问题选择一个最佳答案吗?这不是必需的。ZipInputStream会为您处理这些问题。EJP:但它失败了。但是,entry.getSize()和entry.getCompressedSize()对我来说都返回-1。