基本介绍
- 节点流可以从一个特定的数据源读写数据,如FileReader、FileWriter
- 处理流(也叫包装流)是“连接”在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,如BufferedReader、BufferedWriter
区别与联系
- 节点流是底层流/低级流,直接跟数据源相接
- 处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出
- 处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连【模拟修饰器设计模式】
处理流的功能主要体现在以下两个方面:
- 性能的提高:只要以增加缓冲的方式来提高输入输出的效率
- 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便
(个人理解)例子解释:Read.java是一个抽象类,里面有两个方法,一个读取文件的readFile(),一个读取字符串的readString(),分别通过FileRead.java和StringRead.java实现,这两个相当于节点流,现进行包装,通过BufferRead.java继承Read.java,在BufferRead.java中有一个属性read_,在BufferRead.java中可以将原来的方法封装起来,也可以扩展功能,这样的好处是,在实现时,只需要在包装流中传入想要实现的子类,就可以调用相应的方法,不需要直接跟数据源打交道,使用起来比较方便。(打工人与外包公司的关系,甲方(主类)找外包公司(包装流),外包公司接活儿让打工人(节点流)实现)
Read.java抽象类
package com.zj;
public abstract class Read {
public void readFile(){}
public void readString(){}
//也可以用一个方法管理,如用readMeathod()方法来实现所有的读操作,后面在调用时,利用对象动态绑定机制,绑定到对应的实现子类即可
//public abstract void readMeathod();
}
FileRead.java实现readFile()(节点流)
package com.zj;
public class FileRead extends Read {
public void readFile(){
System.out.println("读取文件。。。");
}
}
StringRead.java实现readString()(节点流)
package com.zj;
public class StringRead extends Read{
public void readString(){
System.out.println("读取字符串。。。");
}
}
通过BufferRead.java包装(包装流/处理流)
package com.zj;
public class BufferRead extends Read{
private Read read_;
//接收Read的子类
public BufferRead(Read read_) {
this.read_ = read_;
}
public void readFile(){//封装一层
read_.readFile();
}
//让方法更加灵活,多次读取文件
public void readFiles(int num){
for (int i=0;i<num;i++){
read_.readFile();
}
}
//扩展readString,批量处理字符串数据
public void readStrings(int num){
for (int i = 0; i< num; i++){
read_.readString();
}
}
}
Test_.java方法调用
package com.zj;
public class Test_ {
public static void main(String[] args) {
BufferRead bufferRead1 = new BufferRead(new FileRead());//传入Read的子类FileRead
bufferRead1.readFile();
bufferRead1.readFiles(4);
BufferRead bufferRead2 = new BufferRead(new StringRead());//传入Read的子类StringRead
bufferRead2.readStrings(5);
}
}
结果: