1

我在android.com上找到了一小段代码:

MessageDigest digester = MessageDigest.getInstance("MD5");
byte[] bytes = new byte[8192];
int byteCount;
while ((byteCount = in.read(bytes)) > 0) {
    digester.update(bytes, 0, byteCount);
}
byte[] digest = digester.digest();

我的问题是:如果我将 "while" 替换为 "if" 会发生什么?

4

5 回答 5

1

android.com 上的示例代码展示了如何MD5InputStream. 您不知道流中有多少字节,是吗?只要您不知道这一点,就必须循环。

现在回答你的问题:

我的问题是:如果我将 "while" 替换为 "if" 会发生什么?

您只能在提供 8192 或更少字节的 InputStream 上生成 MD5 哈希。

或以另一种方式表达:

MD5 散列可能仅对 InputStream 的 8192 字节有效。

注意: InputStream 只能读取当前可用的字节数。因此,即使 InputStream 的源包含超过 8192 个字节,read(byte[8192]) 也可能只读取 10、5 个甚至没有字节。

另见 U Mad 的评论。

于 2013-09-13T05:55:32.807 回答
1

主要是因为它们的长度Stream通常是未知的或不可靠的,并且因为它们一次读取流的“块”。

您可以争辩说,“但我是从文件中读取的”,但是这种方法使您可以灵活地抽象过程,因为您不在乎从哪里读取。

于 2013-09-13T05:48:05.470 回答
0

如果您要进行这样的替换,将会发生的情况是,如果条件成立,大括号内的段将只执行一次。

有一段时间以逐渐填充缓冲区的方式继续迭代。

这是从流中读取数据的常用方式。

于 2013-09-13T05:48:22.690 回答
0

简单的

If --> conditional statement 

(如果条件满足,只检查条件和执行语句一次)

while --> looping statement 

(只要满足条件,就会执行语句)

于 2013-09-13T05:51:08.800 回答
0
what would happen if I replace "while" with "if" ?

只是你不能在那里循环并且只执行一次。

 while(condition)// this will run while condition is true 

 if(condition)// this will execute if condition is true only there is no looping
于 2013-09-13T05:51:26.877 回答