JAVA - 使用ZipInutptuream与FileInputStream损坏ZIP文件

时间:2017-01-05 18:30:15

标签: java servlets fileinputstream zipoutputstream

为什么以下代码在通过servlet输出流输出时可能会生成损坏的zip文件?使用FileOutputStream在本地将ZIP写入磁盘时,输出流似乎没有损坏。

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

这可能是冲洗/关闭流的顺序问题吗?

2 个答案:

答案 0 :(得分:0)

在刷新zip流之前尝试关闭zip条目

// close entry
zos.closeEntry();

zos.flush();

在编码样式上,使用try-with-resources确保资源正确关闭。

答案 1 :(得分:0)

我看到的一个潜在问题是要压缩的各个条目不是唯一的。如果您在这段代码中循环浏览,forZip.getName()可能有重复项。