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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 盛光富 中级黑马   /  2012-5-11 22:42  /  2071 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 盛光富 于 2012-5-11 22:44 编辑

帮忙解下困惑在IO流中
read()方法从文件中读取一个字节, 字节的范围是-128到127.将读取到的byte & 255, 正数值不变, 负数高位补0转为了正数,那读到末尾的时候不是-1吗?这个时候是不是也会转为正数呢?

2 个回复

倒序浏览
以前这样的问题我也纠结过
其实这样的写法可读性并不是很好,我把代码翻译一下,你应该就能看懂了
原始代码:
int temp = 0;
while((temp = input.read())!=-1){
   b[len] = (byte)temp ;
   len++ ;
}

翻译后的代码:
int temp = 0;
temp = input.read();    //通过输入流读取一个字节
while (temp != -1) {      //只要temp的值不是-1,就继续循环
   b[len] = (byte)temp ;
   len++;
   temp = input.read();   //再次通过输入流读取下一个字节
}

这样看的话,楼主的问题就一目了然了
read()每次执行的时候的确只读一个字节
但是由于在第一种写法中,每次循环的时候,read()方法是在while中调用的
所以,在while的判断条件中,实际上执行的是3个操作
第一个操作:input.read();             //通过输入流读取一个字节
第二个操作:temp = input.read(); //将读取到的字节赋值给temp
第三个操作:while(temp != -1);      //判断读取到的字节是否为-1

这个问题带来的收获有两个:
第一:写程序的时候要注重代码的可读性,尽量不要在一行代码中包含过多的逻辑
第二:不管在什么地方调用read()方法,只要调用了read()方法,那么输入流就一定会去读取一个字节

声明:非原创。我收藏的一个答案。很不错哦,分享吧。共同努力,一起进步。

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
简单的说 你把一个byte类型的数据进行了与(&)255运算这是一个类型的提升 得到的是一个int类型的永远是一个正数
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马