字符流的缓冲区
缓冲区的出现提高了对数据的读写效率,缓冲区要结合流才可以使用,在流的基础上对流的功能进行了增强。
对应类:
BufferedWriter
BufferedReader
Demo1:字符写入缓冲区
/*
缓冲区的出现是为了提高流的操作效率而出现的。
所以在创建缓冲区之前,必须要先有流对象。
该缓冲区当中提供了一个跨平台的换行符:newLine(); windows系统的换行是"\r\n",linux是"\n";
*/
import java.io.*;
class BufferedWriterDemo{
public static void main(String[] args) throws IOException{
//创建一个字符写入流对象。
FileWriter fw = new FileWriter("buf.txt");
//为了提高字符写入流的效率,加入缓冲技术。
BufferedWriter bufw = new BufferedWriter(fw);
for(int x=1;x<10;x++){
bufw.write("aaaaa"+x);
bufw.newLine();
//只要用到缓冲区,就要记得刷新
bufw.flush();
}
//关闭缓冲区就是关闭缓冲区中的流对象,所以不用再单独关闭流对象了。
bufw.close();
//不用再单独关闭流对象了。
//fw.close();
}
}
Demo2:字符读取缓冲区
/*
字符读取缓冲区
*/
import java.io.*;
class BufferedReaderDemo{
public static void main(String[] args) throws IOException{
//创建一个读取流对象,和文件相关联。
FileReader fr = new FileReader("buf.txt");
//使用缓冲
BufferedReader bufr = new BufferedReader(fr);
String line = null;
while((line = bufr.readLine()) != null){
System.out.println(line);
}
bufr.close();
}
}
readLine方法原理
无论是读取一行,还是读取多个字符。其实最终都是在硬盘上一个一个字符读取的。
所以最终使用的还是read方法,一次读取一个字符。 readLine读取一个字符就放到内存中,
当读取到换行符的时候,就回把读取到的字符拼接成字符 串返回,但是并没有返回换行符。
装饰设计模式
概述:当想要对已有对象的功能进行增强时,可以定义一个类,将已有对象当作参数传入。基于已有的
功能实现功能增强。那么自定义的类就被成为装饰类。例如:Demo2中BufferedReader类则是FileReader的装饰类,BufferedReader下的readLine方法是FileReader下read方法的增强方法。
Demo3:装饰设计模式
/*
想要对Person类中的吃饭功能进行增强,但又不便于修改源代码。
这时可以使用装饰设计模式,新建个装饰类。
*/
class Person{
public void chifan(){
System.out.println("吃饭");
}
}
//Person的装饰类
class NewPerson{
private Person p;
NewPerson(Person p){
this.p = p;
}
//针对Persion的chifan()方法进行增强
public void newChifan(){
System.out.println("喝点酒");
p.chifan();
System.out.println("饭后水果");
}
}
class PersonDemo{
public static void main(String[] agrs){
Person p = new Person();
//p.chifan();
NewPerson np = new NewPerson(p);
np.newChifan();
}
}
装饰和继承的区别
- 继承扩展性比较差。假如父类A有两个子类A1和A2,对两个子类进行扩展则需要继续向下创建子类A11和A21。如果父类A有了子类A3,那么也需要创建A3的子类A31,扩展性不好。如果使用装饰模式,只需要创建父类A的装饰类即可,父类A有多少子类都不需要在新建子类的子类了。
- 由第一条可以看出继承代码比较臃肿。
- 装饰模式更加灵活