在Java中使用DigestInputStream时出现奇怪的循环

use*_*774 5 java hash

以下代码应该使用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;
    }

}
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么while声明后有分号?它是否正确?当我删除它时,我收到错误.我还没有听说过一段时间之后可以加分号.你能否在这段代码中澄清一下这个案子.

Joa*_*uer 5

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

while (din.read() != -1) {
}
Run Code Online (Sandbox Code Playgroud)

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

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