java extract zip Неожиданный конец входного потока ZLIB

Я создаю программу, которая будет извлекать 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);
        }
    }
}

4 ответа

Решение

Вероятно, это вызвано этой ошибкой JVM (JVM-6519463)

Ранее у меня было около одной или двух ошибок в 1000 случайно созданных документах, я применил предложенное решение (поймал EOFException и ничего с ним не делал), и у меня больше нет ошибок.

Я бы сказал, что вам иногда дают усеченные Zip-файлы для обработки. Проверьте вверх по течению.

У меня было такое же исключение, и проблема была в методе сжатия (а не в извлечении). Я не закрывал ZipOutputStream с помощью после записи в выходной поток. Без этого сжатие работало хорошо, но при извлечении я получил исключение.

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

Никогда не пытайтесь прочитать больше байтов, чем содержится в записи. Вызовите ZipEntry.getSize(), чтобы получить фактический размер записи, затем используйте это значение для отслеживания количества байтов, оставшихся в записи, во время чтения из нее. Увидеть ниже:

try{    

   ...

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

  ...

  }
Другие вопросы по тегам