5

DigestInputStream次のコードは、Java のクラスを使用してテキスト ファイル内の文字列のハッシュを計算することになっています。

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

ループは、Whiledin.read() が -1 でなく、読み取るものがなくなった場合にのみ終了します。それからちょうどその時それを閉じます。

だからあなたはそれを見ることができます:

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 に答える