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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 尘埃落定 中级黑马   /  2014-8-7 17:23  /  3068 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class MyBufferedReader{  
  2.     private FileReader fr;  
  3.     MyBufferedReader(FileReader fr){  
  4.         this.fr = fr;  
  5.     }  
  6.     //可以一次读一行数据的方法  
  7.     public String myReadLine() throws IOException{  
  8.         //定义一个临时容器,原BufferedReader封装的是字符数组  
  9.         //为了方便,定义一个StringBuilder容器,因为最终还是要将数据变成字符串  
  10.         StringBuilder sb = new StringBuilder();  
  11.         int ch = 0;  
  12.         while((ch=fr.read())!=-1){  
  13.             if(ch=='\r')  
  14.                 continue;  
  15.             if(ch=='\n')  
  16.                 return sb.toString();
复制代码


6 个回复

倒序浏览
  • class MyBufferedReader{  
  •     private FileReader fr;  
  •     MyBufferedReader(FileReader fr){  
  •         this.fr = fr;  
  •     }  
  •     //可以一次读一行数据的方法  
  •     public String myReadLine() throws IOException{  
  •         //定义一个临时容器,原BufferedReader封装的是字符数组  
  •         //为了方便,定义一个StringBuilder容器,因为最终还是要将数据变成字符串  
  •         StringBuilder sb = new StringBuilder();  
  •         int ch = 0;  
  •         while((ch=fr.read())!=-1){  
  •             if(ch=='\r')  
  •                 continue;  
  •             if(ch=='\n')  
  •                 return sb.toString();  
  • /*
  • return不是起结束函数的作用么?为什么还能读到下面"if(sb.length()!=0)这句?
  • */
  •             else  
  •             sb.append((char)ch);  
  •         }  
  •         //防止最后一行没有换行的情况  
  •         if(sb.length()!=0){  
  •             return sb.toString();  
  •         }else{  
  •             return null;  
  •         }  
  •     }  
回复 使用道具 举报
假设文本有n行数据,前n-1行数据最后都有换行符,因此方法会通过读取‘\n’,然后返回sb的内容,从而结束方法;但是第n行,也就是最后一行,该行没有换行符,只有文本结束符EOF,它的值为-1。也就是说它在读到-1,从而结束while循环后,sb内的数据并未返回,因此需要通过判断sb的长度是否为0,来决定是否返回sb内数据(有可能文本是空的,没有数据,那么此时sb的长度就为0)。
回复 使用道具 举报
ddewym123 发表于 2014-8-7 17:42
假设文本有n行数据,前n-1行数据最后都有换行符,因此方法会通过读取‘\n’,然后返回sb的内容,从而结束方 ...

你应该理解错我的问题了,我问的是return应该是起结束函数的作用,那下面的if(sb.length()!=0)应该会读不到,不是要加上if(sb.length()!=0)的原因。你回答的应该是为什么要加上最后这个if判断。我的问题是:我知道要加上,可是加上后能读到么?
回复 使用道具 举报
return就是结束标志啊,楼主你还没有理解好你的代码,首先还没有符合这个ch=='\n'条件时,就会跳到else语句中,完成了else语句中的sb.append((char)ch);后,就会开始运行下一个if语句.......
回复 使用道具 举报
你写的这个应该是自定义readLine(),最后的循环外判断只有在数据最后一行没有'\n'的情况下才进入,前n-1行由于都已'\n'所以直接返回s.toString了,最后一行如果没有'\n',那么append以后数据没有返回,所以程序会顺下执行而去执行你担心的部分,最后的 return sb.toString();  
回复 使用道具 举报
尘埃落定 发表于 2014-8-7 22:25
你应该理解错我的问题了,我问的是return应该是起结束函数的作用,那下面的if(sb.length()!=0)应该会读不 ...

我觉得是你没理解我的意思。只有前n-1行,方法才会从while 循环里面的return语句出去;而第n行,方法会从while循环外的那两个return语句出去,至于哪个根据sb,length()判断。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马