gpt4 book ai didi

java - 为什么我不能使用 FileInputStream 来提供 MessageDigest 对象?

转载 作者:行者123 更新时间:2023-11-30 11:06:24 25 4
gpt4 key购买 nike

为什么我必须使用 DigestInputStream 而不是 FileInputStream 来获取文件的摘要?

我编写了一个程序,它从 FileInputStream 读取整数,将它们转换为字节并将它们传递给 MessageDigest 对象的更新方法。但我怀疑它不能正常工作,因为它会计算一个非常大的文件的摘要。为什么它不起作用?

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


public class DigestDemo {

public static byte[] getSha1(String file) {
FileInputStream fis = null;
MessageDigest md = null;

try {
fis = new FileInputStream(file);
} catch(FileNotFoundException exc) {
System.out.println(exc);
}

try {
md = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException exc) {
System.out.println(exc);
}

byte b = 0;
do {

try {
b = (byte) fis.read();
} catch (IOException e) {
System.out.println(e);
}

if (b != -1)
md.update(b);

} while(b != -1);

return md.digest();

}

public static void writeBytes(byte[] a) {
for (byte b : a) {
System.out.printf("%x", b);
}
}

public static void main(String[] args) {

String file = "C:\\Users\\Mike\\Desktop\\test.txt";
byte[] digest = getSha1(file);
writeBytes(digest);

}

}

最佳答案

需要将b的类型改为int,,并且需要在最后调用MessageDigest.doFinal()文件,但这是非常低效的。尝试从字节数组读取和更新。

这段代码中有太多的 try-catching。将其减少到循环外的一次 try 和两次 catchs

关于java - 为什么我不能使用 FileInputStream 来提供 MessageDigest 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29327080/

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