黑马程序员技术交流社区

标题: read()方法内部 [打印本页]

作者: 盛光富    时间: 2012-5-11 22:42
标题: read()方法内部
本帖最后由 盛光富 于 2012-5-11 22:44 编辑

帮忙解下困惑在IO流中
read()方法从文件中读取一个字节, 字节的范围是-128到127.将读取到的byte & 255, 正数值不变, 负数高位补0转为了正数,那读到末尾的时候不是-1吗?这个时候是不是也会转为正数呢?
作者: 黑马-王建雨    时间: 2012-5-11 23:53
以前这样的问题我也纠结过
其实这样的写法可读性并不是很好,我把代码翻译一下,你应该就能看懂了
原始代码:
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()方法,那么输入流就一定会去读取一个字节

声明:非原创。我收藏的一个答案。很不错哦,分享吧。共同努力,一起进步。
作者: 李啸    时间: 2012-5-11 23:56
简单的说 你把一个byte类型的数据进行了与(&)255运算这是一个类型的提升 得到的是一个int类型的永远是一个正数




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