【问题标题】:How many times will this loop read input stream?这个循环将读取输入流多少次?
【发布时间】:2012-03-15 16:10:15
【问题描述】:

我有一段未注释的代码正在尝试理解。 cmets是我自己的。

//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,因为您试图将从流中读取的字节保存到 header[- 1]。因此,由于抛出异常,从循环的第一次运行开始,c 的值将保持等于 3。

我是否正确假设由于捕获了异常,所以 for 循环不会退出?

【问题讨论】:

  • len 怎么会变成-1?

标签: java sockets for-loop stream


【解决方案1】:

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

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

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

【讨论】:

  • 我的逻辑错误是没有意识到在循环的每次迭代之后都会调用增量表达式。我假设它是在循环运行之前,但变量直到循环之后才改变。谢谢。
猜你喜欢
  • 2013-08-05
  • 2019-05-17
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2012-03-19
  • 2015-10-02
  • 2019-07-15
相关资源
最近更新 更多