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

时间:2013-05-15 10:55:46

标签: java hash

以下代码应该使用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声明之后有分号?它是否正确?当我删除它时,我收到错误。我还没有听说过一段时间的声明后可以加一个分号。您能否在此代码中澄清此案例。

3 个答案:

答案 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();