我正在尝试将多个文件读取为BLOB(来自数据库),解压缩,压缩它们并使用JAX-WS流式传输压缩文件。上面的代码流式传输zip文件但是下载的zip文件没有被Windows程序抛出CRC错误打开。在浏览了一些帖子之后,我添加了zipOutputStream.finish()(就在zipOutStream.flush()之前),它似乎修复了错误,但是只压缩了一个文件并忽略了其他文件。
非常感谢任何帮助
try (ResultSet resultSet = pstmt.executeQuery()) {
try (ByteArrayOutputStream byteStream = new ByteArrayOutputStream()) {
try (ZipOutputStream zipOutputStream = new ZipOutputStream(byteStream)) {
while (resultSet.next()) {
Blob blob = getBlob();
try (InputStream fileInputStream = new GZIPInputStream(blob.getBinaryStream())) {
try (ByteArrayOutputStream fileByteStream = new ByteArrayOutputStream()) {
// Custom method: Copy the above fileInputStream to fileByteStream
IOUtils.copy(fileInputStream, fileByteStream);
ZipEntry entry = new ZipEntry(fileName);
zipOutputStream.putNextEntry(entry);
zipOutputStream.write(fileInputStream.toByteArray());
zipOutputStream.flush();
zipOutputStream.closeEntry();
}
}
try (InputStream inputStream = new ByteArrayInputStream(byteStream.toByteArray());) {
InputStreamDataSource inputDataSource = new InputStreamDataSource(fileName, inputStream);
dataHandler = new DataHandler(inputDataSource);
}
}
}
}
}
答案 0 :(得分:1)
您已成功关闭zip文件中的每个条目。
但错过了来关闭ZipOutputStream!
ZipOutputStream.close()
方法会写入目录结构。
顺便说一句.... 您不需要zip文件末尾的目录结构。仅出于兼容性原因预期。