为什么我必须使用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);
}
}
答案 0 :(得分:1)
您需要将b
的类型更改为int,
,并且您需要在文件末尾调用MessageDigest.doFinal()
,但这可能会非常低效。尝试从字节数组中读取和更新。
此代码中有太多尝试。将其减少到循环外的一个try
和两个catches,
。