黑马程序员技术交流社区
标题:
关于read()
[打印本页]
作者:
曹文涛
时间:
2011-8-29 13:58
标题:
关于read()
[code=java] public static void main(String args[]) throws Exception{
File f= new File("d:" + File.separator + "test.txt") ;
InputStream input = null ;
input = new FileInputStream(f) ;
byte b[] = new byte[1024] ;
int len = 0 ;
int temp = 0 ;
while((temp=input.read())!=-1){
b[len] = (byte)temp ;
len++ ;
}
input.close() ; [/code]上面的代码中read()是每次执行时,读一个字节吗,是的话,那意思是每次循环后 它会自动读下一个字节吗?是自动的?然后读到最后了 全读完了以后返回-1中,这还有一点不明白temp=input.read()意思是将读回来的内容给temp,不是将read()返回值给temp是吗?
作者:
徐西宏
时间:
2011-8-29 14:33
read()方法 每执行一次读取一个字节,每次循环会自动读下一个字节,如果读到末尾,刚返回-1;
temp=input.read() input.read() 返回值也就你他读到的一个字节内容,因为他是int类型的,如果你读的内容英文或者汉字或者其它字符就应该把他强转为byte类型。个人理解,互相交流
作者:
匿名
时间:
2011-8-29 14:53
input.read()是读一个字节,while((temp=input.read())!=-1),可以让他读到最后,没有可读的返回-1
因为read()是读一个字节(八位0/1表示),所以可以在一个int范围内表示(byte应该也可以),汉字是双字节,所以用read()读的话,可能会有乱码的问题
作者:
匿名
时间:
2011-8-29 16:10
因为用的是while循环,所以看起来像是“自动”读取下一个字节,如果没有用while循环,就只能读一个字节了,如果读到文件末尾则返回-1
read()方法的返回值是一个int值,字符在计算机中都是以ASCII码的形式保存的,取得时候我们用(byte)(ASCII码值)就相当于是解码,把ACSII码还原成原先的字符
作者:
匿名
时间:
2011-8-29 16:11
不要这样写代码,byte为单字节,int为四字节,int转为byte,会截取低八位的,还有高24位的数值没了
作者:
匿名
时间:
2011-8-29 18:51
为啥我这看楼主的代码好乱呢,,难道因为我用的是opera浏览器么。
作者:
匿名
时间:
2011-8-29 20:04
以前这样的问题我也纠结过
其实这样的写法可读性并不是很好,我把代码翻译一下,你应该就能看懂了
原始代码:
int temp = 0;
while((temp = input.read())!=-1){
b[len] = (byte)temp ;
len++ ;
}
翻译后的代码:
int temp = 0;
temp = input.read(); [color=#808080] [/color][color=#c0c0c0]//通过输入流读取一个字节[/color]
while (temp != -1) { [color=#c0c0c0] //只要temp的值不是-1,就继续循环[/color]
b[len] = (byte)temp ;
len++;
temp = input.read(); [color=#c0c0c0]//再次通过输入流读取下一个字节[/color]
}
这样看的话,楼主的问题就一目了然了
read()每次执行的时候的确只读一个字节
但是由于在第一种写法中,每次循环的时候,read()方法是在while中调用的
所以,在while的判断条件中,实际上执行的是3个操作
第一个操作:input.read(); [color=#48d1cc] [/color][color=#c0c0c0]//通过输入流读取一个字节[/color]
第二个操作:temp = input.read(); [color=#48d1cc] [/color][color=#c0c0c0]//将读取到的字节赋值给temp[/color]
第三个操作:while(temp != -1); [color=#c0c0c0] //判断读取到的字节是否为-1[/color]
这个问题带来的收获有两个:
第一:写程序的时候要注重代码的可读性,尽量不要在一行代码中包含过多的逻辑
第二:[color=Red][b]不管在什么地方调用read()方法,只要调用了read()方法,那么输入流就一定会去读取一个字节[/b][/color]
作者:
匿名
时间:
2011-8-29 20:11
我理解read()读出的是这个字节在机器里存储的编码数字.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2