黑马程序员技术交流社区

标题: readLine()方法的原理 [打印本页]

作者: 路国强    时间: 2013-12-27 12:51
标题: readLine()方法的原理
求BufferedReader中的readLine方法的原理解释!求大哥来相助,回答好的我要写入笔记中。谢谢
作者: 75100313    时间: 2013-12-27 22:48
  1. package com.mth.MyBufferReadLine;

  2. import java.io.FileReader;
  3. import java.io.IOException;

  4. /*
  5. *
  6. * 明白了BufferedReader类中特有方法readLine()之后
  7. * 可以自定义一个类中包含一个功能和readLine()一致的方法
  8. * 来模拟一下BufferedReader
  9. *
  10. *
  11. * */
  12. public class MyBufferedReader {

  13.         private FileReader fr;

  14.         public MyBufferedReader(FileReader fr) {
  15.                 super();
  16.                 this.fr = fr;
  17.         }

  18.         // 可以一次读一行数据的方法
  19.         // 原理就是读一个存一个 结果返回字符串(这个方法来自于FileReader里面的read()方法)
  20.         // 选取集合用StringBuilder 不必考虑大小 正好是string
  21.         // 异常选择抛出 因为是别人调用你的功能 你要告诉别人 有异常 谁调用 谁处理
  22.         public String myReadLine() throws IOException {

  23.                 /*
  24.                  * 定义一个 临时容器 原BufferReader中封装的是字符数组 为了演示方便 定义一个StringBuilder 容器
  25.                  * 因为最终还是要将字符变成字符串
  26.                  */

  27.                 StringBuilder sb = new StringBuilder();
  28.                 int ch = 0;
  29.                 /*
  30.                  * 读一个存一个 当读到回车符的时候 把字符串返回 回车符由(\r\n)构成 sb里面 不存回车符
  31.                  */
  32.                 while ((ch = fr.read()) != -1) {

  33.                         if (ch == '\r')
  34.                                 continue;
  35.                         if (ch == '\n') {
  36.                                 return sb.toString();
  37.                         } else {
  38.                                 sb.append((char) ch);
  39.                         }
  40.                 }
  41.                
  42.                 /*
  43.                  * 这里判断是把最后一行的回车符删除后出现 最后一行读不出来
  44.                  * 实际上已经存在sb里面 只不过 没有返回  加了一个判断
  45.                  *
  46.                  * */
  47.                
  48.                
  49.                 if (sb.length() != 0) {
  50.                         return sb.toString();

  51.                 }

  52.                 return null;
  53.         }

  54.         /*
  55.          * 关闭方法  因为缓冲区是为fr 服务的 所以 fr的关闭就是关闭缓冲区
  56.          */

  57.         public void myClose() throws IOException {

  58.                 fr.close();

  59.         }

  60. }
复制代码





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