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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李万海 中级黑马   /  2013-3-31 21:02  /  1880 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李万海 于 2013-3-31 22:30 编辑
  1. public int myRead()throws IOException
  2.         {
  3.                 //通过in对象读取硬盘上数据,并存储buf中。
  4.                 if(count==0)
  5.                 {
  6.                         count = in.read(buf);
  7.                         if(count<0)
  8.                                 return -1;
  9.                         pos = 0;
  10.                         byte b = buf[pos];

  11.                         count--;
  12.                         pos++;
  13.                         return b&255;
  14.                 }
  15.                 else if(count>0)
  16.                 {
  17.                         byte b = buf[pos];

  18.                         count--;
  19.                         pos++;
  20.                         return b&0xff;
  21.                 }
  22.                 return -1;
  23.         }
复制代码
问一下 老师为了区别-1和2进制-1  ,操作了&255 返回int  避免了-1这个问题。
但是-1的问题是解决了 ,正常的数据也被&255操作了,这样正常数据不就也变化了吗 ?不是很明白这里是怎么操作过去的 ,求解。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 25分咯~

查看全部评分

4 个回复

倒序浏览
本帖最后由 袁梦希 于 2013-3-31 21:22 编辑

楼主你好   正常数据不是不会变化的  因为&255是为了防止他的返回值不为-1,如果返回的为-1了,那么就复制的MP3肯定不够
那么正常数据才会出现错误。11111111 是byte型是-1,前面补了24个1是int型的-1,还是-1,所以&255才不会返回就不会返回错误时候的-1了。
结论:
字节流的读一个字节的read方法为什么返回值类型不是byte,而是int。
因为有可能会读到连续8个二进制1的情况,8个二进制1对应的十进制是-1.
那么就会数据还没有读完,就结束的情况。因为我们判断读取结束是通过结尾标记-1来确定的。
所以,为了避免这种情况将读到的字节进行int类型的提升。
并在保留原字节数据的情况前面了补了24个0,变成了int类型的数值。
而在写入数据时,只写该int类型数据的最低8位。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,请继续追问; 没有的话,将帖子分类改成【已解决】~
回复 使用道具 举报
学习了!{:soso_e113:}
回复 使用道具 举报
学习了{:soso_e100:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马