一、缓冲字符流
1、缓冲字符流出现的原因:FileReader对象,每次调用read()方法进行读操作时,都会直接去文件汇总读取字节,转换成字符并返回,这样频繁的读取文件效率很低。 缓冲字符流的出现就是为了提高效率。
2、缓冲字符的构造方法:
public BufferedReader(Reader in);//创建一个使用默认大小输入缓冲区的缓冲字符输入流。
public BufferedReader(Reader in, int sz);//创建一个使用给定大小输出缓冲区的新缓冲字符输入流。如果sz小于等于0,将抛出IllegalArgumentException异常。
public BufferedWriter(Writer out) ;//与输入流一样
public BufferedWriter(Writer out, int sz); //与输入流一样
二、实例
1、FileWriter fw=null;
BufferedWriter bw=null;
try {
fw = new FileWriter("demo.txt");//字符的输出流,数据的写入
bw = new BufferWriter(fw);//构建缓冲的字符流,对已有流的封装
bw.write("hell0");
bw.newLine();//增加换行符
bw.write("java");
bw.newLine();
bw.flush();//把缓冲区的内容刷新到目的地
}
2、import java.io.*;
public class MyBufferedReader {
//类的属性,代表普通 的字符输入流对象,修饰的对象
private Reader r;//利用自己类的父类可以接受子类,从而体现多态性
//构造方法
static int n=1;
public MyBufferedReader(Reader r){//体现多态性
this.r=r;
}
//readLine()方法:实现的功能是读一行,增加缓冲区,然后调用r对象的read()读取字符放在缓冲区中,
//当读到行标记时,就把缓冲区中的字符中的字符转换成字符串返回
public String readLine(){
//缓冲区
StringBuffer strB = new StringBuffer();
int ch = 0;
try {
while((ch=r.read())!=-1){
//'\r'和'\n'是回车换行,只有在两个都存在时才可实现
if(ch=='\r'){
continue;
}
if(ch=='\n'){
return (n++)+"\t"+new String(strB);// 等价 strB.toString()
}else{
strB.append((char)ch);//追加放置在缓冲区里
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//当读到最后一行的时候,判断最后一行是否到结尾,是否有字符返回。
if((strB.length())!=0){
return new String(strB);
}
return null;
}
//close()方法
public void close(){
try {
r.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
三、装饰设计模式和继承的区别
装饰设计模式比继承有更好的灵活性。因为装饰模式和继承相比,继承中的类在建立缓冲字符流时,是在每次使用时建立一个,这样的重复性会很大,如果用装饰模式,可以只建立一个类,只要在使用时调用它就行了。就好比是抽象类、接口一样,把共同的东西提前出来。
当然,每个事物都是有两方面的,有优点必定有缺点。
出现的新的问题:该类虽然完成对已有两个对象的增强。但是当有新的对象出现时,还要继续在该类中添加构造函数。这样不利于扩展和维护。