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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曹文涛 黑马帝   /  2011-8-29 13:58  /  2352 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[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是吗?

7 个回复

倒序浏览
read()方法 每执行一次读取一个字节,每次循环会自动读下一个字节,如果读到末尾,刚返回-1;
temp=input.read()   input.read()  返回值也就你他读到的一个字节内容,因为他是int类型的,如果你读的内容英文或者汉字或者其它字符就应该把他强转为byte类型。个人理解,互相交流
回复 使用道具 举报
黑马网友  发表于 2011-8-29 14:53:54
藤椅
input.read()是读一个字节,while((temp=input.read())!=-1),可以让他读到最后,没有可读的返回-1
因为read()是读一个字节(八位0/1表示),所以可以在一个int范围内表示(byte应该也可以),汉字是双字节,所以用read()读的话,可能会有乱码的问题
回复 使用道具 举报
黑马网友  发表于 2011-8-29 16:10:02
板凳
因为用的是while循环,所以看起来像是“自动”读取下一个字节,如果没有用while循环,就只能读一个字节了,如果读到文件末尾则返回-1

read()方法的返回值是一个int值,字符在计算机中都是以ASCII码的形式保存的,取得时候我们用(byte)(ASCII码值)就相当于是解码,把ACSII码还原成原先的字符
回复 使用道具 举报
黑马网友  发表于 2011-8-29 16:11:36
报纸
不要这样写代码,byte为单字节,int为四字节,int转为byte,会截取低八位的,还有高24位的数值没了
回复 使用道具 举报
黑马网友  发表于 2011-8-29 18:51:22
地板
为啥我这看楼主的代码好乱呢,,难道因为我用的是opera浏览器么。
回复 使用道具 举报
黑马网友  发表于 2011-8-29 20:04:09
7#
以前这样的问题我也纠结过
其实这样的写法可读性并不是很好,我把代码翻译一下,你应该就能看懂了
原始代码:
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]

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 回答的很好。

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-29 20:11:32
8#
我理解read()读出的是这个字节在机器里存储的编码数字.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马