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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 无气打火机 于 2013-7-22 18:00 编辑
  1. import java.io.*;
  2. class MyBufferedReader {
  3.         FileReader r;
  4.         MyBufferedReader(FileReader r) {
  5.                 this.r=r;
  6.         }
  7.         //可以一次读一行数据的方法。
  8.         public String myReadeLine() throws IOException{
  9.                 //定义一个临时容器,原Bufferedreader封装的是字符数组。
  10.                 //为了演示方便,定义一个StringBuffer容器,因为最终还是要将数据变成字符串

  11.                 StringBuffer sb = new StringBuffer();
  12.                 int ch=0;
  13.                 while((ch=r.read())!=-1) {
  14.                         if(ch=='\r')
  15.                                 continue;
  16.                         if(ch=='\n')
  17.                                 return sb.toString();//这里为什么返回仅仅是读到的那一行?前面读到的就不见了?
  18.                                                              //前面也没有初始化里面的数据啊。。。。到底怎么回事?
  19.                         else
  20.                                 sb.append((char)ch);
  21.                 }
  22.                 if(sb.length()!=0) {
  23.                         return sb.toString();//还有这里,老师说是返回最后读到的数据,它难道也就仅仅保存最                          后读到的数据?前面的也没有了?
  24.                 }
  25.                 return null;
  26.         }
  27.         public void myClose() throws IOException {
  28.                 r.close();
  29.         }
  30. }


  31. class MyBufferedReaderDemo {

  32.         public static void main(String[] args) throws IOException{
  33.                 FileReader fr = new FileReader("e:\\buf.txt");
  34.                 MyBufferedReader mbd = new MyBufferedReader(fr);
  35.                 String line=null;
  36.                 while((line=mbd.myReadeLine())!=null) {
  37.                         System.out.println(line);
  38.                 }
  39.                 mbd.myClose();
  40.         }
  41. }
复制代码
这道题我足足想了好几天了,实在想不出来为什么啊

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

3 个回复

正序浏览
forward 发表于 2013-7-21 22:54
String line=null;
                while((line=mbd.myReadeLine())!=null) {
                        Sy ...

谢谢,终于知道了
回复 使用道具 举报
String line=null;
                while((line=mbd.myReadeLine())!=null) {
                        System.out.println(line);
                }
1.因为当调用myReadeLine()方法是,你在键盘的在同一行的话,在这个mbd.myReadeLine()中执行循环进行字符连接,知道你按回车键('\r\n')后,这个方法你前面在键盘上输入的数据,执行 return sb.toString()此时这个方法结束
2.然后执行 while((line=mbd.myReadeLine())!=null) {
                        System.out.println(line);
                }只要一调用myReadeLine()方法,就行重新初始化StringBuffer sb = new StringBuffer();此时sb变量存的是空的。然后在继续存储你输入的信息,知道你按回车然会你读取键盘的信息,这样这个方法就又结束了,
希望你能懂,希望对你有帮助!
回复 使用道具 举报
  1. while((ch=r.read())!=-1){
  2.     if(ch=='\r')
  3.        continue;
  4.     if(ch=='\n')
  5.       return sb.toString();
  6.      else
  7.       sb.append((char)ch);
  8.   }
  9.   /*
  10.   上面那个循环的含义:
  11.     未读到\r\n之前,所有字符被添加到StringBuilder中
  12.         一旦读到\r\n返回当前行的字符串
  13.   */
  14.   if(sb.length()!=0) {
  15.     return sb.toString();
  16.   }
  17. /*
  18.   这个判断目的:
  19.   如果文件最后一行没有回车(\r\n)
  20.   那么上面的while执行完后最后一行数据添加到了StringBuilder中
  21.   但是无法return
  22. */
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马