public synchronized int read() throws IOException {
if (pos >= count) {
fill();
if (pos >= count)
return -1;
}
return getBufIfOpen()[pos++] & 0xff;
}
这是java.io包中BufferedInputStream类的read方法。可以看到其返回值,如果指针移到末尾则返回-1,否则返回getBufIfOpen()[pos++] & 0xff。
通过阅读源码得知getBufIfOpen()[pos++]是一个byte类型变量。为什么要和0xff做&运算呢?
因为要保证只有读到流的末尾才返回-1。
byte范围-128~127。包含了-1,因此读到-1不能判断到底是流中的-1还是表示结束的-1。
由于返回值是int类型(0xff也是int!!!!)。
0xff的二进制表示:0000 0000 1111 1111;
-1的二进制表示: 1111 1111 1111 1111;
-1&0xff = 0000 0000 1111 1111 = 256;
也就是说byte类型的-1被转成了int类型的256。然后我们需要的实际类型还是byte,那么来一个强转。结果还是1111 1111,也就是byte类型的-1。能拿到正确结果的同时也避免了读到的值和结束标记混淆的错误。