java - 是否可以将 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
文件两次才能在上传之前识别其校验和。
有什么方法可以将我的ZipOutputStream
above 和 a结合起来DigestOutputstream
,这样我就可以在编写 zip 文件时更新我的校验和?不幸的是,由于输出流必须是 a ZipOutputStream
,我不能简单地装饰它(即new DigestOutputStream(zipStream, digest)
)。
解决方案
不幸的是,由于输出流必须是 a
ZipOutputStream
,我不能简单地装饰它(即new DigestOutputStream(zipStream, digest)
)。
无论如何你都不想这样做,因为你想消化压缩操作的结果,所以你需要用 包装DigestOutputStream
,ZipOutputStream
即另一种方式:
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
始终正确关闭。
推荐阅读
- javascript - 为什么 bitwsie AND 操作 00000100000001000001000100 & 11111100000000000000000000 === 0?
- modelsim - Modelsim 显示有关 vmap 命令的未知警告
- azure - Azure 服务总线中的数据库/缓存,用于在其他地方完成的队列中的作业
- webrtc - Nest Battery Cam GenerateWebRtcStream 命令出现 INVALID_ARGUMENT 错误
- azure - Azure Appservice - 禁止 - 尝试停止 Appservice 实例的 w3wp 进程时出现 403 错误
- lua - LUA - 如何阻止脚本运行
- r - 创建具有比例的条形图
- postgresql - TimescaleDB 对比 InfluxDB 到 PLC 日志记录
- javascript - 匹配对象然后计算学生成绩的成绩
- arrays - 我的任务是编写一个递归函数来打印索引为素数的数组的所有数字