了解流的本质是队列,懂得区分输入、输出流;理解“抽象流”和“具体流”之分,并掌握通过面向“抽象流”面程以获得代码更好的适用性
1. “流” 的目的与本质
流的目的是为了解耦。
1.1 “耦合 / Coupling ”是什么?
看出下图中的“耦合”关系了吗?
事物之间存在不必要的关系,就叫耦合;这种关系往往会引发双方(甚至多方)在后续产生额外的牵制关系。
1.2 “流”解的是谁和谁的耦合?
以“面对面”的方式(有时还加上“一对一”的关系)进行数据交接的双方,很容易产生时间、地点、方式上的耦合。
以生活中的事情为例,假设要求快递一定要将货物面对面的交给买家,甚至要求买家签字(其实,最早的快递,基本就是如此),那么,就至少有如下耦合:
- 时间耦合:不是你等快递员,就是快递员等你;
- 地点耦合:收货地点是公司,可是今天你请假在家;收货地点是家,可是今天你996;
- 方式耦合:不仅要当面交接,如买家因种种原因拒签,则容易引发双方纠纷;
程序中的数据交接,如果也只能走“面对面”这一种形式,同样容易引发各种耦合。因此,想要解除或降低A和B之间因数据交接产生的耦合,方法是在二者之间塞入一个第三方:数据缓存区。这各现实上快递和收货人之间的解耦的本质是一样:东西放在楼下小店、放在菜鸟驻站、放在丰巢……
1.3 🎞️视频一:“流” 的基本概念
来看一段视频——
C++之“流”-第1课:掌握基本概念
1.4 流的本质是队列
学完视频之后,我们了解到以下几点:
- 流的本质是队列,即:一个带有顺序保障的数据缓存区;
- 依据程序的视角,流区分为输入流和输出流;
- 向程序输入数据的流,叫输入流;程序向之输出数据的流,叫输出流;
- “ostream” 代表抽象的、泛指的输出流,文件输出流 “ofstream”和字符串输出流 “ostringstream” 都是输出流;
- “istream” 代表抽象的,泛指的输入流,文件输入流“ifstream”和字符串输入流“istringstream”都是输入流;
- 文件流可视为“外存流”,具有外存的特点:可理解为永久存储,但读写较慢;
- 字符串流可视为“内存流”,具有内存的特点:不能永远存储,但读写更快;
- 如上所述,文件流和内存流都可以既是输入流,也是输出流。
2. 下节预告
基于以上知识,下一节我们将动手写充满C++“流”风味的日志系统的第一个版本。