黑马程序员技术交流社区

标题: 两段代码有何不同? [打印本页]

作者: 尘埃落定    时间: 2014-5-31 18:25
标题: 两段代码有何不同?
本帖最后由 尘埃落定 于 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());
                        }
                }

        }

}




作者: KevinSmart    时间: 2014-5-31 20:01
你代码发的不全,重新发一遍吧
作者: 尘埃落定    时间: 2014-6-1 11:49
KevinSmart 发表于 2014-5-31 20:01
你代码发的不全,重新发一遍吧

已经补全。

用插入代码的方式加代码会发不全。
作者: 教皇    时间: 2014-6-1 16:16
  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. }
复制代码

作者: yuZhe_toString    时间: 2014-6-1 16:51
两者没有区别,只是后者将前者提出执行了一下而已。
作者: 相濡、彼岸    时间: 2014-6-1 19:56
如果写while的话,int num=0;的作用还有一个,那就是归零!因为你的第二种写法num再一直计数,没有归零,如果想停止就需要自定义结束,可以在打印语句下面加上break;这是我的理解!
作者: liang090214    时间: 2014-6-1 20:38
学习学习。。。。。。。
作者: Autumn    时间: 2014-6-1 20:59
执行以下看看结果
作者: Ice丶wj    时间: 2014-6-2 09:27
有可能死循环吧
作者: 我是main    时间: 2014-6-2 18:18
红色部分代码  是一个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里面的内容重复输出无数次! 这显然是不符合编程的  故切记 蓝色代码  不可写!
作者: 尘埃落定    时间: 2014-6-2 21:23
相濡、彼岸 发表于 2014-6-1 19:56
如果写while的话,int num=0;的作用还有一个,那就是归零!因为你的第二种写法num再一直计数,没有归零,如 ...

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

【红色部分代码  是一个while 循环   条件在循环中 可以进行数次判断直到num=fr.read(buf)的值等于-1 才会停止】这句话讲的明明白白的。
{:3_57:}
作者: Autumn    时间: 2014-6-3 08:21
红色的好一点,
作者: 我是main    时间: 2014-6-3 10:24
为毛我没分!::@

作者: 尘埃落定    时间: 2014-6-4 21:11
我是main 发表于 2014-6-3 10:24
为毛我没分!:

淡定,同志!
看这里http://bbs.itheima.com/thread-119734-1-1.html




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