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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尘埃落定 中级黑马   /  2014-5-31 18:25  /  2165 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 尘埃落定 于 2014-6-1 11:48 编辑

以下代码,红色部分和蓝色部分有何不同?红色运行结果正常,蓝色会无线循环,求详细原因。

import java.io.*;

public class FileReaderDemo2 {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                FileReader fr = null;
                try{
                        fr = new FileReader("demo.txt");
                               
                        char[] buf =new char[1024];
                        int num = 0;  
                       while((num = fr.read(buf))!=-1){
                                System.out.println(num+"......"+new String(buf,0,num));
                        }
                   /*
                   int num = fr.read(buf);  
                       while(num!=-1){
                                System.out.println(num+"......"+new String(buf,0,num));
                        }
                   */
                }

                catch(IOException e){
                        System.out.println(e.toString());
                }

                finally{
                        try{
                                if(fr!=null)
                                        fr.close();
                        }
                        catch(IOException e){
                                System.out.println(e.toString());
                        }
                }

        }

}



评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 赞一个!

查看全部评分

14 个回复

倒序浏览
你代码发的不全,重新发一遍吧
回复 使用道具 举报 1 0
KevinSmart 发表于 2014-5-31 20:01
你代码发的不全,重新发一遍吧

已经补全。

用插入代码的方式加代码会发不全。
回复 使用道具 举报 1 0
  1. import java.io.*;

  2. public class FileReaderDemo2
  3. {

  4.         public static void main(String[] args)
  5.         {
  6.           // TODO Auto-generated method stub
  7.                         FileReader fr = null;
  8.                 try
  9.                 {
  10.                  fr = new FileReader("demo.txt");
  11.                                 
  12.                  char[] buf =new char[1024];
  13.                   /*  
  14.                  int num = 0;  
  15.                   while((num = fr.read(buf))!=-1)  //此语句是一次读一个字节,读完之后返回-1,作为循环结束的条件,
  16.                   {
  17.                                 System.out.println(num+"......"+new String(buf,0,num));
  18.                   }
  19.            */
  20.           int num = fr.read(buf);  //而此语句是将fr.read(buf)赋值给num,那么num就不可能是-1;
  21.            while(num!=-1)//所以当你执行(num!=—1)条件时,此条件为真,那么它会一直执行下去。个人理解希望对你有用
  22.                     {        。
  23.                 System.out.println(num+"......"+new String(buf,0,num));
  24.             }
  25.                   
  26.                  }

  27.                 catch(IOException e)
  28.                 {
  29.                         System.out.println(e.toString());
  30.                 }

  31.                  finally
  32.                  {
  33.                         try
  34.                          {
  35.                                  if(fr!=null)
  36.                                 fr.close();
  37.                          }
  38.                         catch(IOException e)
  39.                          {
  40.                                 System.out.println(e.toString());
  41.                         }
  42.                  }

  43.      }

  44. }
复制代码
回复 使用道具 举报
两者没有区别,只是后者将前者提出执行了一下而已。
回复 使用道具 举报
如果写while的话,int num=0;的作用还有一个,那就是归零!因为你的第二种写法num再一直计数,没有归零,如果想停止就需要自定义结束,可以在打印语句下面加上break;这是我的理解!
回复 使用道具 举报
学习学习。。。。。。。
回复 使用道具 举报
执行以下看看结果
回复 使用道具 举报
有可能死循环吧
回复 使用道具 举报
红色部分代码  是一个while 循环   条件在循环中 可以进行数次判断直到num=fr.read(buf)的值等于-1 才会停止,也就是 如果fr对象的长度超过char数组 buf 的长度 那么num=fr.read(buf)就会调用一次以上,直到全部读完fr 对象的里的内容 ,而且每循环一次 就会打印一次 结果 ,直到打印完.

蓝色部分代码 因为单独把 int num=fr.read(buf);放一行 没写进while的条件里 那么它就只会调用一次,也就是char数组有多长他就写多长的内容进去,即使fr对象的长度超过buf 它也只能读取buf长度的内容,剩下的内容不会再被读进去   ,并且如果 fr对象有数据 while(num!=-1) 就会一直成立 也就是说  while里面的代码 会一直循环下去, 也就是把 buf里面的内容重复输出无数次! 这显然是不符合编程的  故切记 蓝色代码  不可写!

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报 2 0
相濡、彼岸 发表于 2014-6-1 19:56
如果写while的话,int num=0;的作用还有一个,那就是归零!因为你的第二种写法num再一直计数,没有归零,如 ...

请教:归零再这里好像没有什么作用吧?
回复 使用道具 举报
我是main 发表于 2014-6-2 18:18
红色部分代码  是一个while 循环   条件在循环中 可以进行数次判断直到num=fr.read(buf)的值等于-1 才会停 ...

【红色部分代码  是一个while 循环   条件在循环中 可以进行数次判断直到num=fr.read(buf)的值等于-1 才会停止】这句话讲的明明白白的。
{:3_57:}
回复 使用道具 举报
红色的好一点,
回复 使用道具 举报
为毛我没分!::@
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马