1. 节点流可以从一个特定的数据源读写数据,如FileReader、FileWriter
  2. 处理流(也叫包装流)是“连接”在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,如BufferedReader、BufferedWriter

    节点流和处理流的区别和练联系

  3. 节点流是底层流/低级流,直接跟数据源相接。

  4. 处理流包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
  5. 处理流(也叫包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连[模拟修饰器设计模式]

    处理流的功能主要体现在一下两个方面

  6. 性能的提高:主要以增加缓冲的方式来提高输入输出的效率。

  7. 操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便

    例如: BufferedReader 类中,有属性Reader,即可以封装一个节点流,该节点流可以是任意的.只要是Reader子类

对模拟修饰器设计模式的理解

image.png

Reader_

  1. package test;
  2. public abstract class Reader_ { //抽象类
  3. public void readFile() {
  4. }
  5. public void readString() {
  6. }
  7. //在Reader_ 抽象类,使用read方法统一管理.
  8. //后面在调用时,利于对象动态绑定机制, 绑定到对应的实现子类即可.
  9. //public abstract void read();
  10. }

FileReader_

  1. package test;
  2. /**
  3. * 节点流
  4. */
  5. public class FileReader_ extends Reader_ {
  6. @Override
  7. public void readFile() {
  8. System.out.println("对文件进行读取...");
  9. }
  10. }

StringReader_

  1. package test;
  2. /**
  3. * 节点流
  4. */
  5. public class StringReader_ extends Reader_ {
  6. @Override
  7. public void readString() {
  8. System.out.println("读取字符串..");
  9. }
  10. }

BufferedReader_

  1. package test;
  2. /**
  3. * 做成处理流/包装流
  4. */
  5. public class BufferedReader_ extends Reader_{
  6. private Reader_ reader_; //属性是 Reader_类型
  7. //接收Reader_ 子类对象
  8. public BufferedReader_(Reader_ reader_) {
  9. this.reader_ = reader_;
  10. }
  11. @Override
  12. public void readFile() { //封装一层
  13. reader_.readFile();
  14. }
  15. //让方法更加灵活, 多次读取文件, 或者加缓冲byte[] ....
  16. public void readFiles(int num) {
  17. for(int i = 0; i < num; i++) {
  18. reader_.readFile();
  19. }
  20. }
  21. //扩展 readString, 批量处理字符串数据
  22. public void readStrings(int num) {
  23. for(int i = 0; i <num; i++) {
  24. reader_.readString();
  25. }
  26. }
  27. }

Main

  1. package test;
  2. public class Main {
  3. public static void main(String[] args) {
  4. BufferedReader_ bufferedReader_ = new BufferedReader_(new FileReader_());
  5. bufferedReader_.readFiles(2);
  6. //bufferedReader_.readFile();
  7. //Serializable
  8. //Externalizable
  9. //ObjectInputStream
  10. //ObjectOutputStream
  11. //这次希望通过 BufferedReader_ 多次读取字符串
  12. BufferedReader_ bufferedReader_2 = new BufferedReader_(new StringReader_());
  13. bufferedReader_2.readStrings(3);
  14. }
  15. }

image.png