基本介绍
- 节点流可以从自特定的数据源,如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);
}
}
结果: