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) {
...
}
...
}