以下代码应该使用Java中的DigestInputStream
类计算文本文件中字符串的哈希值。
import java.io.*;
import java.security.*;
public class ReturnDigest extends Thread {
private File input;
private byte[] digest;
public ReturnDigest(File input) {
this.input = input;
}
public void run() {
try {
FileInputStream in = new FileInputStream(input);
MessageDigest sha = MessageDigest.getInstance("SHA");
DigestInputStream din = new DigestInputStream(in, sha);
int b;
while ((b = din.read()) != -1) ;
din.close();
digest = sha.digest();
}
catch (IOException ex) {
System.err.println(ex);
}
catch (NoSuchAlgorithmException ex) {
System.err.println(ex);
}
}
public byte[] getDigest() {
return digest;
}
}
我的问题是:为什么在while
声明之后有分号?它是否正确?当我删除它时,我收到错误。我还没有听说过一段时间的声明后可以加一个分号。您能否在此代码中澄清此案例。
答案 0 :(得分:4)
这是一个空循环,读取的值没有任何操作。事实上,人们可以完全摆脱变量b
:
while (din.read() != -1) {
}
我还用空块替换了分号(空语句),因为这里稍微更清楚一点。
这是一种从输入流中读取的非常不典型的方法(通常你想用读取的数据做),因为摘要输入流有副作用:如果你从中读取它也计算读取的任何内容的散列。如果仅想要哈希,则需要阅读,但不需要对读取的值执行任何操作。
答案 1 :(得分:1)
这是对的。
while ((b = din.read()) != -1) ;
din.close();
While
循环只会在din.read()不为-1时退出,此时无需阅读。然后就会关闭它。
所以你可以看到它:
while ((b = din.read()) != -1) ;
和
while ((b = din.read()) != -1)
{ }
是平等的。
答案 2 :(得分:0)
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
DigestInputStream digestInputStream = new DigestInputStream(inputStream, messageDigest);
byte[] buffer = new byte[4096];
int count = 0;
while (digestInputStream.read(buffer) > -1) {
count++;
}
log.info("total read: " + count);
MessageDigest digest = digestInputStream.getMessageDigest();
digestInputStream.close();
byte[] md5 = digest.digest();
StringBuilder sb = new StringBuilder();
for (byte b: md5) {
sb.append(String.format("%02X", b));
}
String checkSum = sb.toString();