黑马程序员技术交流社区
标题:
readLine
[打印本页]
作者:
晨若兰曦
时间:
2015-3-3 17:14
标题:
readLine
readLine() 的实现机制是什么?有谁知道啊。。
作者:
alvis2015
时间:
2015-3-3 17:48
老毕的视频里讲的,注意听
作者:
sofeel
时间:
2015-3-3 17:54
内部调用到了动态数组,可以动态的缓存一行的数据,
当遇到换行的标志时,不再缓存并将数组内容转成字符串。
其实,函数内部调用了StringBuilder或者StringBuffer.
作者:
sofeel
时间:
2015-3-3 17:58
给你一道我前天做的题你看看
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Test8 {
/**
* 自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,
* 能够在读取的每行前面都加上有行号和冒号。
*/
public static void main(String[] args) {
/*
* 思路:
* 包装类,需要用到装饰的设计模式。
* 装饰设计:以原类的对象为属性,对原类的功能进行包装增强。
*
* 步骤:
* 一,类的设计
* 1,创建类EnhanceReader,封装Reader为属性(面向接口)。
* 2,私有空构造方法,对外提供带参的构造方法。参数类型为Reader。
* 3,增强read方法:
* a,能换行;
* b,每行前面有行号和冒号.
*
* 二,测试。
* 读取Test8.java文件,打印到控制台。
*
*
*
* 总结:
*
* 一,装饰设计模式
* 是一种整体上的思想。
* 1,它的设计理念摆脱了继承的束缚。
* 从继承体系的私有职责变成了非继承式的公共服务。
* 2,开拓了一种新型的关系结构。
* 装饰设计的类与其服务的类是一种服务与被服务的关系。
*
* 二,缓冲技术
* StringBuffer、StringBuilder这两兄弟的出现,是对数组和String的极大增强并为集合的登场做好了铺垫。
* buffer,内置了动态数组,具有了缓冲能力,即有了预见性。另外,它能容纳的成员几乎包括了所有,八大基本类型、对象。
* 特点概括总结为:
* 1,长度可变;
* 2,类型多样性;
* 3,整体操作型。即缓冲能力,这是基于第一点实现的。
*
* */
try
{
File file=new File("src/com/itheima/Test8.java");
EnhanceReader er = new EnhanceReader(new FileReader(file));
String line=null;
while((line=er.enReadLine())!=null)
System.out.println(line);
er.close();
} catch (FileNotFoundException e) {e.printStackTrace();}
}
}
class EnhanceReader{
private FileReader fileReader;//面向接口
private StringBuilder stringBuilder;
int num;
//私有空参构造方法
private EnhanceReader(){
}
public EnhanceReader(FileReader fileReader){
this.fileReader=fileReader;
}
//读取一行
public String enReadLine(){
stringBuilder=new StringBuilder();//提供可变数组,存储一行的数据返回
int len=0;
String line=null;
try {
while((len=fileReader.read())!=-1)
{
if(len=='\r')
continue;
if(len=='\n')
{
/*
* 返回带行号的数据有两种方式:
* 1,拼字符串。(++num)+":"+line
* 2,在一行开始插入。(++num)+":"
* */
line=stringBuilder.insert(0, (++num)+":").toString();
return line;
}
stringBuilder.append((char)len);
}
} catch (IOException e) {e.printStackTrace();}
return null;
}
//关闭
public void close(){
try {
if(fileReader!=null)
fileReader.close();//关闭资源
} catch (Exception e1) {System.out.println("资源关闭失败"+e1);}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2