注册也有一段时间了,有问题有时间就会到论坛来逛逛,发现很多问题都已经有人问了,而有时候又经常有人问相关的问题但非同样的。对于黑马要求自学必学课程,毕竟不是很多,所以,一直想,如果有时间把所有的分类整理一下就好了。比如说毕老师的课程中哪些问题难点思路解析,张孝祥老师的课程等。
现在的话,把自己对毕老师自定义字节流缓冲区的思路进行彻底的解析一下,希望对各位有点帮助。有什么不懂,不清楚的,欢迎在下面回复,有时间按一定回答。当然,也想拿点技术分啦!呵呵呵。。。- 要实现自定义的缓冲区,那么首先要了解缓冲区读取数据的原理。
- 首先,缓冲要有缓冲的对象,即字节输入流(InputStream),以及用于缓冲的容器(定义一个字节输入流对象)。这里我们可以用字节数组。缓冲区的原理就是通过read方法一个一个字节的读取字节流缓冲区的内容。而要实现通过数组一个字节一个字节读取数组中内容,就需要知道数组中存放个数以及数组指针(定义一个数组byte[] buf以及指针pos和记录个数的变量count)。有了这些,我们就可以通过InputStream的字节流读取方法read读入到字节流缓冲区buf中,并用count方法记录读取的个数。当把数据读入数组以后,我们就可以通过pos指针获取读取的对象啦!获取一个,count个数减1,pos上移一个(+1),然后返回。因为只有当所有的数据取完了,才重新读取,pos重新为0,所以当count大于0的时候,我们只需要取就可以啦!当读取完时,也就是通过字节流缓冲区获得的count值为-1时,读取结束。那为什么返回值使用int型而不是byte型呢?这个因为byte只有8位,也就是说如果出现超过8位都为1的情况的话,那么他们的返回值就一定为-1,这样就出问题了,原本不是-1的,返回值出现-1,所以,我们就用int型替代byte型。这样读取的位数就多了,同时,因为获取的字节数组中的均为byte型,为保证向int转型时添加的24位均为0(int为4字节),那么我们可以通过与运算“&255”的方式,(255二进制表示前面24位均为0)转型时添加的均为0(其实也就是取一个字节(8位)的大小,并保证原值);而返回-1的时候,-1默认为int型,不用调用与运算,直接返回-1,这样,我们就完成了一个自定义的缓冲区啦!而为什么转型后大小不变呢,因为write()方法运行的时候存在强转,只写最低8位,所以保证原数据不变(write方法原来就是只能一次写字节,所以当读取的提升时,存在强转)
复制代码 思路都非常的清楚,相信自己对照一下代码,非常容易理解的!
|