background image

看一下 InputStream 的 read 方法的说明,了解一下其返回值就会发现,返回值可能为-
1,即已读到 InputStream 末尾再继续读时。如果发生读取异常,可能出现这个问题,而
这个循环没有检查 readBytes 值是否为-1 就往 totalRead 上加,这样再次进入循环体继
续读取 InputStream,又返回-1,继续循环。如此循环直到 int 溢出才会跳出循环。而这
个循环也就成了实实在在的 CPU 杀手,可以占去大量的 CPU 时间(取决于操作系统)。其
实解决很简单,对 readBytes 进行判断,如果为-1 则跳出循环。
  这个例子告诉我们:对循环一定要搞清循环的循环规模、每次循环体执行时间、循环
结束条件包括异常情况等,只有这样才能写出高效且没有隐患的代码。