Zip文件流引发CRC错误

时间:2018-03-19 22:54:53

标签: java zip

我正在尝试将多个文件读取为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);
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

关闭流

您已成功关闭zip文件中的每个条目。

错过了来关闭ZipOutputStream!

ZipOutputStream.close()方法会写入目录结构。

顺便说一句.... 您不需要zip文件末尾的目录结构。仅出于兼容性原因预期。