- 节点流可以从一个特定的数据源读写数据,如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_ {@Overridepublic void readFile() {System.out.println("对文件进行读取...");}}
StringReader_
package test;/*** 节点流*/public class StringReader_ extends Reader_ {@Overridepublic 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_;}@Overridepublic 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);}}

