5

以下代码应该使用DigestInputStreamJava 中的类计算文本文件中字符串的哈希值。

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?这个对吗?当我删除它时,我得到错误。我从未听说过可以在 while 语句后放置分号。你能澄清一下这段代码中的情况吗?

4

3 回答 3

6

这是一个空循环,读取的值没有做任何事情。事实上,人们可以完全摆脱这个变量b

while (din.read() != -1) {
}

我还用一个空块替换了分号(空语句),因为这对这里发生的事情更加明确。

这是从输入流中读取的一种非常非典型的方式(通常你想对读取的数据一些事情),因为摘要输入流有一个副作用:如果你从中读取它还会计算任何内容的哈希被读取。如果您想要哈希,则需要读取,但不需要对读取的值做任何事情。

于 2013-05-15T11:00:18.550 回答
1

它是正确的。

while ((b = din.read()) != -1) ;
din.close();

只有当 din.read() 不为 -1 时,While循环才会退出,此时没有更多内容可读取。然后,就在那时将关闭它。

所以你可以看到它:

while ((b = din.read()) != -1) ;

while ((b = din.read()) != -1) 
{  }

是平等的。

于 2013-05-15T10:57:22.110 回答
-1
    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();
于 2018-05-10T13:41:03.053 回答