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

问题描述:

下面的代码应该使用Java中的DigestInputStream类为文本文件中的字符串计算散列。在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语句之后分号?它是否正确?当我删除它时,我收到错误。我从来没有听说过可以在一段时间的陈述后加上一个分号。你能否在这个代码中澄清这个问题。

+1

直到'din.read()!= -1',它是一个空循环!只需清除流中的所有数据! – NINCOMPOOP

+0

@AsierAranbarri:你的回答很好(我确实赞成它),但也许他正在寻找更多关于为什么有一个空循环的信息(毕竟这不是太常见)。 –

+0

@JoachimSauer我明白你的答案更好。给他更多关于这个问题的信息,很明显你比我有更多的经验。我刚刚发表了评论(刚刚删除),因为他先选择了我的答案,然后未选中,之后选中了你的答案。有些奇怪......我只是心情不好! :) –

这是一个空循环,没有任何数值读取完成。事实上,我们可以摆脱可变b干脆的:

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

我也换成了分号(空语句)与空块,因为这是稍微明确什么在这里发生。

这是从输入流(通常要一些与读取数据)读取一个非常典型的方式,因为摘要输入流有一个副作用:如果你读这本书是计算任何读取的散列。如果你想只有想要散列,你需要阅读,但不需要对读取的值做任何事情。

+0

对于'b'的+1未使用。 – johnchen902

这是正确的。

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

While循环就当din.read()不为-1,当有什么更多的只读退出。然后,就在那时关闭它。

所以你可以看到它:

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

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

是相等的。