A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© meng 高级黑马   /  2013-8-27 23:30  /  1070 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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位。


*/

评分

参与人数 1技术分 +1 收起 理由
以防万一 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
public int myRead()throws IOException
楼主是说的上面这个方法的返回值么?这个返回值不是读取字节的个数么?
回复 使用道具 举报
避免读到一个字节全是零时,直接结束,读取时类型提升,写入时还是去最低八位
回复 使用道具 举报
返回整数表示所读的字节数量,-1表示没有内容
回复 使用道具 举报
{:soso_e176:}
亲,请问下问题是否解决?
如果已解决请及时将未解决改为已解决
如果未解决请回帖追问
三天未回复的将视为已解决

详情参考: 如何更改分类

保持队形,谢谢合作{:soso_e121:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马