黑马程序员技术交流社区

标题: 关于IO流缓冲区自定义readLine方法的问题 [打印本页]

作者: 无气打火机    时间: 2013-7-21 22:26
标题: 关于IO流缓冲区自定义readLine方法的问题
本帖最后由 无气打火机 于 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. }
复制代码
这道题我足足想了好几天了,实在想不出来为什么啊
作者: 张洪慊    时间: 2013-7-21 22:47
  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. */
复制代码

作者: 杨增坤    时间: 2013-7-21 22:54
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变量存的是空的。然后在继续存储你输入的信息,知道你按回车然会你读取键盘的信息,这样这个方法就又结束了,
希望你能懂,希望对你有帮助!
作者: 无气打火机    时间: 2013-7-22 17:59
forward 发表于 2013-7-21 22:54
String line=null;
                while((line=mbd.myReadeLine())!=null) {
                        Sy ...

谢谢,终于知道了




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