本帖最后由 周兴华 于 2012-9-4 20:07 编辑
这段视频中的代码是毕老师写出BufferedInputStream的read方法的原理。改read方法为重写了InputStream的read方法,重写后的read方法作用是一次读一个字节,从缓冲区(字节数组)获取。
字节流的读一个字节的read方法为什么返回值类型不是byte,而是int?
因为有可能会读到连续8个二进制1的情况,8个二进制1对应的十进制是-1.
那么就会数据还没有读完,就结束的情况。因为我们判断读取结束是通过结尾标记-1来确定的。
所以,为了避免这种情况将读到的字节进行int类型的提升。
并在保留原字节数据的情况前面了补了24个0,变成了int类型的数值。
楼主首先要清楚byte型数据连续8个1为什么是-1?
0000 0001 //这个是1
1111 1110 //按位取反
1111 1111 //将按位取反后的数据再加上1就是其负数也就是-1了。
为什么要将b&255?
因为原来InputStream的read方法每次读一个字节的数据,那么就有可能会读到连续8个1的情况,而连续8个1以byte型表示为-1,在做了int型的提升后还是-1,因为他会对前面24位补齐为1,也就是变成了11111111 11111111 11111111 11111111,而我们判断读取结束是通过结尾标记-1来确定的,这个字节的数据又是有效的,显然我们要避免。所以要与上一个255.即
11111111 11111111 11111111 11111111 //读取到的连续8个1的数据做int型提升后的结果
00000000 00000000 00000000 11111111 //255
00000000 00000000 00000000 11111111 //&255以后就保留了低8位,也就是我们要的数据。
&是按位操作符,只有1&1的结果为1,1&0,0&1或0&0的结果都是0. |