首页 > 解决方案 > 是否可以将 ZipOutputStream 和 DigestOutputstream 结合起来?

问题描述

在将文件上传到某处之前,我需要确定.zip文件的校验和,以便确保文件完整性。

目前,我有以下内容:

        for (File file : zipCandidates) {
            InputStream fileInputStream = new BufferedInputStream(new FileInputStream(file));
            ZipUtils.addDataToZip(zipStream, fileInputStream, file.getName());
            boolean deleted = file.delete();
            if (!deleted) {
                log.error("Failed to delete temporary file {} : {}", file.getName(), file.getAbsolutePath());
            }
        }
        zipStream.close();

        // checksum and filesize
        long fileSize = zipFile.length();
        InputStream fileInputStream = FileUtils.openInputStream(zipFile);
        BufferedInputStream bufferedFileInputStream = new BufferedInputStream(fileInputStream);
        String checksum = DigestUtils.md5Hex(bufferedFileInputStream);

        bufferedFileInputStream.close();


        // upload
        fileInputStream = FileUtils.openInputStream(zipFile);
        bufferedFileInputStream = new BufferedInputStream(fileInputStream);
        val writer = writerFactory.createWriter(blobName, fileSize, checksum);
        writer.write(bufferedFileInputStream);

        bufferedFileInputStream.close();

不用说,这是非常低效的,因为我必须读取每个.zip文件两次才能在上传之前识别其校验和。

有什么方法可以将我的ZipOutputStreamabove 和 a结合起来DigestOutputstream,这样我就可以在编写 zip 文件时更新我的​​校验和?不幸的是,由于输出流必须是 a ZipOutputStream,我不能简单地装饰它(即new DigestOutputStream(zipStream, digest))。

标签: javastreamzipchecksum

解决方案


不幸的是,由于输出流必须是 a ZipOutputStream,我不能简单地装饰它(即new DigestOutputStream(zipStream, digest))。

无论如何你都不想这样做,因为你想消化压缩操作的结果,所以你需要用 包装DigestOutputStreamZipOutputStream即另一种方式:

try (ZipOutputStream zipStream = new ZipOutputStream(
                                   new DigestOutputStream(
                                     new FileOutputStream(zipFile),
                                     digest))) {
    // code adding zip entries here
}
String checksum = Hex.encodeHexString(digest.digest());

请注意使用 try-with-resources 以确保您ZipOutputStream始终正确关闭。


推荐阅读