'java extract zip Unexpected end of ZLIB input stream

I am creating a program that will extract a zip and then insert the files into a database, every so often I get the error

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

I can not pinpoint the reason for this as the extraction code is pretty much the same as all the other code you can find on the web. My code is as follows:

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


Solution 1:[1]

I would say you are occasionally being given truncated Zip files to process. Check upstream.

Solution 2:[2]

I had the same exception and the problem was in the compressing method (not extracting). I did not close the ZipOutputStream with zos.closeEntity() after writing to the output stream. Without that, compressing worked well but I got an exception while extracting.

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

Solution 3:[3]

Never attempt to read more bytes than the entry contains. Call ZipEntry.getSize() to get the actual size of the entry, then use this value to keep track of the number of bytes remaining in the entry while reading from it. See below :

try{    

   ...

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

  ...

  }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 user207421
Solution 2 Aleksandar
Solution 3 Drona