这个循环读取输入流多少次?

时间:2012-03-15 16:10:15

标签: java sockets for-loop stream

我有一块未注释的代码,我试图理解。评论是我自己的。

//create an array name header that holds 4 bytes
byte header[] = new byte[4];
int len = 0;
int c = -1;

for(; len != 3; len += c)// run loop till len = 3
{
  try
  {
    //first run of the loop following should be true
    //read 3 bytes and save into header array starting at 0
    // c = number of bytes read (most likely 3 after first run of loop)

    c = is.read(header, len, 3 - len);

  }
  catch(Exception e)
  {
     System.err.println("read header error " + e.getMessage());
     displayErrorMessage(e);
  }
  if(c == -1)
    return null;

}

此代码正在读取输入流,但我不确定它将循环多少次。 我尝试在纸上循环,每次都替换lenc,在7次迭代后,len仍然不等于3。

在第二次循环运行期间,len应该等于-1且c应该等于3. -1应该使read方法抛出IndexOutOfBoundsException,因为你试图将从流中读取的字节保存到头[-1]。因此,由于抛出了异常,因此从循环的第一次运行开始,c的值将保持等于3。

我是否正确地假设因为异常被捕获,for循环不会退出?

1 个答案:

答案 0 :(得分:3)

循环重复的次数不确定,因为read()可能在第一次运行时读取3个字节并终止 - 或者它可能一次读取1个字节,并重复3次。 / p>

然而,正如评论所说 - read()很可能在第一次迭代期间读取3个字节,而循环只有一次迭代。
对于这种情况,会发生以下情况:

  1. 检查len < 3是否
  2. 读取3个字节到数组,并设置c = 3
  3. 检查是否c == -1 - 它不是
  4. 结束循环:设置len = len + c = 3
  5. 检查是否len < 3 - 它不是:终止循环