黑马程序员技术交流社区

标题: 关于自定义一个字节流缓冲区 [打印本页]

作者: Alex shaw    时间: 2013-3-20 09:33
标题: 关于自定义一个字节流缓冲区
本帖最后由 肖路宽 于 2013-3-20 12:18 编辑

老毕关于IO流19天第十四个视频讲的自定义字节流缓冲区,为什么要用一个byte与上一个00000000000000000000000011111111,求解释

作者: 刘凯    时间: 2013-3-20 09:45
是这个样子的

字节流读取数据 以 -1来作为标示
而在字节流读取的时候每次读一个字节 也就是8位  很有可能读取的8为全是1  
也就是11111111  这个就是byte类型的-1 而返回值是int型的所以会提升为1111111 1111111 1111111 1111111  这个恰好为int类型的-1
这时字节流read方法返回-1这个值  程序认为已经读取完毕 然而并非如此 后边还有没有读取的数据 所以这样是不行的

于是 必须在读取数据提升为1111111 1111111 1111111 1111111 且返回之前&上个00000000000000000000000011111111   
使数据前24位为0  也就是00000000 00000000 00000000 1111111   这个是int类型的255  而不是-1 所以返回的数值为255

当字节流在写入时 又会将32位的数据 只取后8位  就又成了111111   

这个视频上有详细讲解的  建议楼主仔细看看在
作者: Alex shaw    时间: 2013-3-20 09:48
刘凯 发表于 2013-3-20 09:45
是这个样子的

字节流读取数据 以 -1来作为标示

扫噶,我当时看了,只不过不是太懂,讲的很详细,谢谢
作者: 张亚青    时间: 2013-3-20 09:49
本帖最后由 张亚青 于 2013-3-20 09:53 编辑

一、因为读取的时候如果读取媒体文件到byte[]字节数组中,每次读取1个字节,即8个bit,有可能会遇到 11111111,而该值直接赋值给int类型并返回的话 ,值为-1,会造成“字节流读取结束”的假象,(值-1,为读取到结束的标志)。
二、为了解决这一问题,就在每次读取8bit的时候,手动在前面补上24个0,byte类型的“11111111”就会变成int类型的 “00000000 00000000 00000000 11111111”;
三、为了实现上面这一技术,就要让“11111111”和“00000000000000000000000011111111”相与&。

作者: Alex shaw    时间: 2013-3-20 09:50
张亚青 发表于 2013-3-20 09:49
一、因为读取的时候如果读取媒体文件到byte[]字节数组中,每次读取1个字节,即8个bit,有可能会遇到 111111 ...

恩 明白了 谢啦 哥们




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2