黑马程序员技术交流社区
标题:
这个小题比较难
[打印本页]
作者:
meng
时间:
2013-8-27 23:30
标题:
这个小题比较难
本帖最后由 meng 于 2013-9-1 21:41 编辑
来一个我认为比较难理解的地方,那个-1的地方就是不容易理解,谁能给讲讲,为啥返回值是int?
写在这也是为了加深印象
import java.io.*;
class MyBufferedInputStream
{
private InputStream in;
private byte[] buf = new byte[1024*4];
private int pos = 0,count = 0;
MyBufferedInputStream(InputStream in)
{
this.in = in;
}
//一次读一个字节,从缓冲区(字节数组)获取。
public int myRead()throws IOException
{
//通过in对象读取硬盘上数据,并存储buf中。
if(count==0)
{
count = in.read(buf);
if(count<0)
return -1;
pos = 0;
byte b = buf[pos];
count--;
pos++;
return b&255;
}
else if(count>0)
{
byte b = buf[pos];
count--;
pos++;
return b&0xff;
}
return -1;
}
public void myClose()throws IOException
{
in.close();
}
}
/*
11111111-111111110000000000101001001010100101010010101001010
byte: -1 ---> int : -1;
00000000 00000000 00000000 11111111 255
11111111 11111111 11111111 11111111
11111111 -->提升了一个int类型 那不还是-1吗?是-1的原因是因为在8个1前面补的是1导致的。
那么我只要在前面补0,即可以保留原字节数据不变,又可以避免-1的出现。
怎么补0呢?
11111111 11111111 11111111 11111111
&00000000 00000000 00000000 11111111
------------------------------------
00000000 00000000 00000000 11111111
0000-0001
1111-1110
000000001
1111-1111 -1
结论:
字节流的读一个字节的read方法为什么返回值类型不是byte,而是int。
因为有可能会读到连续8个二进制1的情况,8个二进制1对应的十进制是-1.
那么就会数据还没有读完,就结束的情况。因为我们判断读取结束是通过结尾标记-1来确定的。
所以,为了避免这种情况将读到的字节进行int类型的提升。
并在保留原字节数据的情况前面了补了24个0,变成了int类型的数值。
而在写入数据时,只写该int类型数据的最低8位。
*/
作者:
masterV
时间:
2013-8-28 00:07
public int myRead()throws IOException
楼主是说的上面这个方法的返回值么?这个返回值不是读取字节的个数么?
作者:
泡沫之夏
时间:
2013-8-28 01:47
避免读到一个字节全是零时,直接结束,读取时类型提升,写入时还是去最低八位
作者:
老衲玩IT
时间:
2013-8-28 12:13
返回整数表示所读的字节数量,-1表示没有内容
作者:
以防万一
时间:
2013-8-31 14:24
{:soso_e176:}
亲,请问下问题是否解决?
如果已解决请及时将
未解决
改为
已解决
如果未解决请回帖追问
三天未回复的将视为已解决
详情参考:
如何更改分类
保持队形,谢谢合作{:soso_e121:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2