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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 晨若兰曦 中级黑马   /  2015-3-3 17:14  /  855 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

readLine() 的实现机制是什么?有谁知道啊。。

3 个回复

倒序浏览
老毕的视频里讲的,注意听
回复 使用道具 举报
内部调用到了动态数组,可以动态的缓存一行的数据,
当遇到换行的标志时,不再缓存并将数组内容转成字符串。
其实,函数内部调用了StringBuilder或者StringBuffer.

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1 赞一个!

查看全部评分

回复 使用道具 举报
给你一道我前天做的题你看看
  1. import java.io.BufferedReader;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5. import java.io.IOException;

  6. public class Test8 {

  7.         /**
  8.          * 自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,
  9.          * 能够在读取的每行前面都加上有行号和冒号。
  10.          */
  11.         public static void main(String[] args) {
  12.                 /*
  13.                  * 思路:
  14.                  * 包装类,需要用到装饰的设计模式。
  15.                  * 装饰设计:以原类的对象为属性,对原类的功能进行包装增强。
  16.                  *
  17.                  * 步骤:
  18.                  * 一,类的设计
  19.                  * 1,创建类EnhanceReader,封装Reader为属性(面向接口)。
  20.                  * 2,私有空构造方法,对外提供带参的构造方法。参数类型为Reader。
  21.                  * 3,增强read方法:
  22.                  *                         a,能换行;
  23.                  *                         b,每行前面有行号和冒号.
  24.                  *
  25.                  * 二,测试。
  26.                  * 读取Test8.java文件,打印到控制台。
  27.                  *
  28.                  *
  29.                  *
  30.                  * 总结:
  31.                  *
  32.                  * 一,装饰设计模式
  33.                  * 是一种整体上的思想。
  34.                  * 1,它的设计理念摆脱了继承的束缚。
  35.                  * 从继承体系的私有职责变成了非继承式的公共服务。
  36.                  * 2,开拓了一种新型的关系结构。
  37.                  * 装饰设计的类与其服务的类是一种服务与被服务的关系。
  38.                  *
  39.                  * 二,缓冲技术
  40.                  * StringBuffer、StringBuilder这两兄弟的出现,是对数组和String的极大增强并为集合的登场做好了铺垫。
  41.                  * buffer,内置了动态数组,具有了缓冲能力,即有了预见性。另外,它能容纳的成员几乎包括了所有,八大基本类型、对象。
  42.                  * 特点概括总结为:
  43.                  * 1,长度可变;
  44.                  * 2,类型多样性;
  45.                  * 3,整体操作型。即缓冲能力,这是基于第一点实现的。
  46.                  *
  47.                  * */
  48.                        
  49.                         try
  50.                         {
  51.                                 File file=new File("src/com/itheima/Test8.java");
  52.                                
  53.                                 EnhanceReader er = new EnhanceReader(new FileReader(file));
  54.                                 String line=null;
  55.                                
  56.                                 while((line=er.enReadLine())!=null)
  57.                                         System.out.println(line);
  58.                                
  59.                                 er.close();
  60.                                
  61.                         } catch (FileNotFoundException e) {e.printStackTrace();}
  62.         }

  63. }

  64. class EnhanceReader{
  65.        
  66.         private FileReader fileReader;//面向接口
  67.         private StringBuilder stringBuilder;
  68.         int num;
  69.        
  70.         //私有空参构造方法
  71.         private EnhanceReader(){
  72.                
  73.         }
  74.        
  75.         public EnhanceReader(FileReader fileReader){
  76.                
  77.                 this.fileReader=fileReader;
  78.         }
  79.        
  80.         //读取一行
  81.         public String enReadLine(){
  82.                
  83.                 stringBuilder=new StringBuilder();//提供可变数组,存储一行的数据返回
  84.                 int len=0;
  85.                 String line=null;
  86.                
  87.                 try {
  88.                         while((len=fileReader.read())!=-1)
  89.                         {
  90.                                 if(len=='\r')
  91.                                         continue;
  92.                                 if(len=='\n')
  93.                                 {
  94.                                         /*
  95.                                          * 返回带行号的数据有两种方式:
  96.                                          * 1,拼字符串。(++num)+":"+line
  97.                                          * 2,在一行开始插入。(++num)+":"
  98.                                          * */
  99.                                         line=stringBuilder.insert(0, (++num)+":").toString();
  100.                                         return line;
  101.                                 }
  102.                                
  103.                                 stringBuilder.append((char)len);
  104.                         }
  105.                 } catch (IOException e) {e.printStackTrace();}
  106.                
  107.                 return null;
  108.         }
  109.        
  110.         //关闭
  111.         public void close(){
  112.                
  113.                 try {
  114.                         if(fileReader!=null)
  115.                                 fileReader.close();//关闭资源
  116.                 } catch (Exception e1) {System.out.println("资源关闭失败"+e1);}
  117.         }
  118.        

  119. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马