gpt4 book ai didi

java - 是否可以组合 ZipOutputStream 和 DigestOutputstream?

转载 作者:行者123 更新时间:2023-11-29 04:10:00 24 4
gpt4 key购买 nike

在将 .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 文件 两次 才能在上传文件之前辨别其校验和。

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

最佳答案

Unfortunately, since the output stream has to be a ZipOutputStream, I cannot simply decorate it (i.e. new DigestOutputStream(zipStream, digest)).

无论如何你都不想这样做,因为你想消化压缩操作的结果,所以你需要用 ZipOutputStream 包装 DigestOutputStream ,换句话说:

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 始终正确关闭。

关于java - 是否可以组合 ZipOutputStream 和 DigestOutputstream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55637167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com