- 节点流可以从一个特定的数据源读写数据,如FileReader、FileWriter
处理流(也叫包装流)是“连接”在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,如BufferedReader、BufferedWriter
节点流和处理流的区别和练联系
节点流是底层流/低级流,直接跟数据源相接。
- 处理流包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连[模拟修饰器设计模式]
处理流的功能主要体现在一下两个方面
性能的提高:主要以增加缓冲的方式来提高输入输出的效率。
- 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便
例如: BufferedReader 类中,有属性Reader,即可以封装一个节点流,该节点流可以是任意的.只要是Reader子类
对模拟修饰器设计模式的理解
Reader_
package test;
public abstract class Reader_ { //抽象类
public void readFile() {
}
public void readString() {
}
//在Reader_ 抽象类,使用read方法统一管理.
//后面在调用时,利于对象动态绑定机制, 绑定到对应的实现子类即可.
//public abstract void read();
}
FileReader_
package test;
/**
* 节点流
*/
public class FileReader_ extends Reader_ {
@Override
public void readFile() {
System.out.println("对文件进行读取...");
}
}
StringReader_
package test;
/**
* 节点流
*/
public class StringReader_ extends Reader_ {
@Override
public void readString() {
System.out.println("读取字符串..");
}
}
BufferedReader_
package test;
/**
* 做成处理流/包装流
*/
public class BufferedReader_ extends Reader_{
private Reader_ reader_; //属性是 Reader_类型
//接收Reader_ 子类对象
public BufferedReader_(Reader_ reader_) {
this.reader_ = reader_;
}
@Override
public void readFile() { //封装一层
reader_.readFile();
}
//让方法更加灵活, 多次读取文件, 或者加缓冲byte[] ....
public void readFiles(int num) {
for(int i = 0; i < num; i++) {
reader_.readFile();
}
}
//扩展 readString, 批量处理字符串数据
public void readStrings(int num) {
for(int i = 0; i <num; i++) {
reader_.readString();
}
}
}
Main
package test;
public class Main {
public static void main(String[] args) {
BufferedReader_ bufferedReader_ = new BufferedReader_(new FileReader_());
bufferedReader_.readFiles(2);
//bufferedReader_.readFile();
//Serializable
//Externalizable
//ObjectInputStream
//ObjectOutputStream
//这次希望通过 BufferedReader_ 多次读取字符串
BufferedReader_ bufferedReader_2 = new BufferedReader_(new StringReader_());
bufferedReader_2.readStrings(3);
}
}