节点流和处理流(包装流)
节点流
节点流可以从一个 “特定的” 数据源读写数据,如FileReader,FileWriter,这两个就只能从 file文件中读写数据.
处理流(包装流)
处理流(包装流)是"连接"在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,也更加灵活,如BufferedReader,BufferedWriter ,这两个不仅能够处理file文件,而且还能够处理其他数据源.
处理流使用了"装饰者设计模式".
节点流与处理流的区别
常见的节点流和处理流
处理流原理:装饰者详解
装饰者模式和代理模式的区别:
1.代理模式强调的是控制,装饰模式强调的是增强。
2.代理模式强调的是透明访问,装饰模式强调的是自由构建。
代码模拟演示
抽象类
Reader_
public abstract class Reader_ { //抽象类
public void readFile() {}
public void readString() {}
}
节点流
FileReader_
/**
* 节点流
*/
public class FileReader_ extends Reader_{
public void readFile() {
System.out.println("对文件进行读取...");
}
}
StringReader_
/**
* 节点流
*/
public class StringReader_ extends Reader_{
public void readString() {
System.out.println("对字符串进行读取...");
}
}
处理流
BufferedReader_
/**
* 做成处理流/包装流
*/
public class BufferedReader_ extends Reader_{
private Reader_ reader_;
//接收Reader_ 子类对象
public BufferedReader_(Reader_ reader_) {
this.reader_ = reader_;
}
//也可以仅仅只是调用,封装一层就可以
public void readFile(){ //封装一层
reader_.readFile();
}
//让方法更加灵活, 多次读取文件 ,或者加缓冲
public void readFiles(int num){
for (int i = 0; i < num; i++) {
reader_.readFile();
}
}
//扩展 readSteing ,批量处理字符串数据
public void StringFiles(int num){
for (int i = 0; i < num; i++) {
reader_.readString();
}
}
}
main方法测试
public class Test_ {
public static void main(String[] args) {
BufferedReader_ bufferedReader_ = new BufferedReader_(new FileReader_()); //传进去一个FileReader_
bufferedReader_.readFiles(5);
bufferedReader_.readFile();
//通过 BufferedReader_ 多次读取字符串
BufferedReader_ bufferedReader_2 = new BufferedReader_(new StringReader_());
bufferedReader_2.StringFiles(3);
}
}
测试结果