黑马程序员技术交流社区

标题: 这个小题比较难 [打印本页]

作者: 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