节点流
节点流可以从一个特定的数据源读写数据,类似FileReader和FileWriter只能对文件进行读入写出操作,而CharReader和CharWriter只能对数组进行读入写出操作
节点流是底层流,直接根数据源连接
- 节点流和处理流
处理流(包装流)
处理流(包装流)是连接已存在的流(节点流和处理流)之上,为程序提供更加强大的功能和灵活性,类似BufferedReader和BufferedWriter中分别封装了属性Reader和Writer,这样就是封装一个节点流并且该节点是任意的可以是对文件的可以是对数组的,只要是Readr和Writer的子类就行(装饰者模式)
总结就是:
处理流(包装流),包装节点流既可以消除不同节点流的实现差异,也可以提供更加方便的方法来完成输入与输出
处理流,对节点流进行包装,使用修饰器模式,不会直接与数据源相连
处理流功能1.性能的提高,主要以增加缓冲的方式来提高输入输出的效率
2.操作的便捷:处理流可能提供一系列便捷的方法来一次输入输出大批量的数据,使用更加方便
以代码的方式简单理解处理流的装饰者模式
- 我在抽象类中定义的方法我不去实现,交给子类去实现
public abstract class Reader {
//我在抽象类中定义的方法我不去实现,交给子类去实现
public void readFile(){
}
public void readArray(){
}
}
- 重写父类的方法以及在方法体中写出如何读取文件的内容
//模仿字节流读取文件
public class ReadFile extends Reader {
//重写父抽象类的方法
public void readFile(){
//如何读取文件的代码
//。。。。。。。。。
System.out.println("文件读取...");
}
}
- 重写父类的方法以及在方法体中写出如何读取数组的内容
//模仿字节流读取数组
public class ReadArray extends Reader{
//重写父抽象类的方法
public void readArray(){
//如何读取数组的代码
//。。。。。。。。。
System.out.println("数组读取...");
}
}
- 封装一个字节流父类的属性
- 这样就可以接收该父类的子类 定义的对象(传入一个字节流类的对象)
- 就可以通过该对象调用该类的方法,完成不同数据源的工作(完成数据源为文件的,是数组的…)
– - 也可以进行功能的扩展像是多次读取文件
//包装流
public class BufferedReader extends Reader{
private Reader reader;
//定义一个有参构造,传值,可以接收Reader的子类对象,像是传一个读取文件字节流或者读取数组字节流
public BufferedReader(Reader reader) {
this.reader = reader;
}
//这里就是给reader传值的是读取文件类型的数据子类对象,然后就可以去调用该子类对象对应的字节流
public void readFile(){//封装一层
reader.readFile();
}
//也可以进行功能的扩展像是多次读取文件,就是说对文件读取进行扩展,我们现在可以批量读取文件
//给该方法传值,就是传读取文件多少次
public void readFiles(int sum){
for (int i = 0; i <sum; i++) {
reader.readFile();
}
}
public void readArrays(int sum){
for (int i = 0; i <sum; i++) {
reader.readArray();
}
}
}
//测试类
public class Test {
public static void main(String[] args) {
BufferedReader bufferedReader = new BufferedReader(new ReadFile());
bufferedReader.readFile();
BufferedReader bufferedReader1 = new BufferedReader(new ReadArray());
bufferedReader1.readArrays(5);
}
}