gpt4 book ai didi

java - ZipInputStream 和 DigestInputStream 不能一起工作

转载 作者:太空宇宙 更新时间:2023-11-04 13:29:31 28 4
gpt4 key购买 nike

当我尝试即时计算 zip 文件的 MD5 并同时解压缩它时,对于某些 zip 文件,它不起作用:尽管文件没有损坏,但 MD5 和不正确。

这是我的代码片段:

MessageDigest lMd = MessageDigest.getInstance("MD5");

FileOutputStream lFos = null;
try (DigestInputStream lDis = new DigestInputStream(lListener.getInputStream(), lMd);
ZipInputStream lZip = new ZipInputStream(lDis)) {

// Read the response content
//get the zipped file list entry
ZipEntry lZipEntry = lZip.getNextEntry();

while (lZipEntry != null) {
String lFileName = lZipEntry.getName();

File lNewFile = new File(UPDATE_FOLDER + File.separator + lFileName);

if (lZipEntry.isDirectory()) {
lNewFile.mkdirs();
} else {
//create all non exists folders
new File(lNewFile.getParent()).mkdirs();

lFos = new FileOutputStream(lNewFile);

int lRead;
while ((lRead = lZip.read(lBuffer)) > -1) {
lFos.write(lBuffer, 0, lRead);
}

lFos.close();
}

lZipEntry = lZip.getNextEntry();
}

lZip.closeEntry();
} finally {
if (lFos != null) {
lFos.close();
}
byte[] lDigest = lMd.digest();

StringBuffer lHexString = new StringBuffer();
for (int lI = 0; lI < lDigest.length; lI++) {
if ((0xFF & lDigest[lI]) < 0x10) {
lHexString.append("0"
+ Integer.toHexString((0xFF & lDigest[lI])));
} else {
lHexString.append(Integer.toHexString(0xFF & lDigest[lI]));
}
}
String lDigestStr = lHexString.toString();

你能帮我吗?

谢谢!来吧!

最佳答案

您需要将这两个操作分开。 ZipInputStream并不是为了完全消耗底层流而构建的。原因是 ZIP 文件格式基本上如下所示:

<file header><file data>
<file header><file data>
<file header><file data>
<...>
<last file header><last file data>
<directory header>
<directory header>
<directory header>
<...>
<last directory header>

<file header><directory header>有不同的签名。这就是 ZipInputStreamgetNextEntry() 时执行称为:

if (get32(tmpbuf, 0) != LOCSIG) {
return null;
}

它验证刚刚读取的缓冲区是否以字符“PK\003\004”开头,这将是正确的文件头。但是,一旦目录头开始,这将开始返回 null因为目录头是“PK\001\002”。

此后ZipInputStream将返回null来自getNextEntry()之后您将停止食用它。针对您的特定问题的唯一解决方案是首先验证文件,然后解压它。正如评论中提到的,无论如何您都应该这样做,因为如果验证失败,您绝对不应该使用该文件!

关于java - ZipInputStream 和 DigestInputStream 不能一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32328226/

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