JAVA - поврежденный ZIP-файл с использованием ZipOutptuStream с FileInputStream

Почему следующий код генерирует поврежденный zip-файл при выводе через поток вывода сервлета? При локальной записи ZIP на диск с помощью FileOutputStream поток вывода не поврежден.

// Create zip stream
ZipOutputStream zos = new ZipOutputStream(this.servletOutputStream);

// prepare a new entry
ZipEntry zipEntry = new ZipEntry(forZip.getName());
zipEntry.setSize(forZip.getTotalSpace());
zipEntry.setTime(System.currentTimeMillis());

// write entry
zos.putNextEntry(zipEntry);

// write the file to the entry
FileInputStream toBeZippedInputStream = new FileInputStream(forZip);
IOUtils.copy(toBeZippedInputStream, zos);
zos.flush();

// close entry
zos.closeEntry();

// close the zip
zos.finish();
zos.close();

this.servletOutputStream.flush();

this.servletOutputStream.close();

// close output stream
IOUtils.closeQuietly(toBeZippedInputStream);

Возможно, это проблема с порядком очистки / закрытия потоков?

1 ответ

Решение

Попробуйте закрыть запись zip перед очисткой потока zip

// close entry
zos.closeEntry();

zos.flush();

В стиле кодирования используйте try-with-resources, чтобы убедиться, что ресурсы закрыты правильно.

Я вижу потенциальную проблему в том, что отдельные архивируемые записи не уникальны. Если вы просматриваете этот код,forZip.getName() могут иметь дубликаты.

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