
“流”Stream这个名字的起源可以追溯到计算机科学早期其核心思想源于一个非常直观的物理比喻将数据视为一条连续不断、有方向性的“水流”。这个概念的普及很大程度上归功于麻省理工学院MIT在20世纪60年代开发的CTSSCompatible Time-Sharing System兼容分时系统和MulticsMultiplexed Information and Computing Service多路信息与计算服务操作系统。 核心隐喻数据如水在那个时代计算机的输入输出设备五花八门如纸带阅读器、卡片穿孔机、电传打字机、磁带机等。这些设备的物理特性差异巨大为每一种设备编写独立的、不兼容的I/O代码是一项极其繁琐且容易出错的工作。为了解决这个问题CTSS和Multics的设计者们提出了一个革命性的抽象概念I/O Stream。连续性就像河水一样数据被视为一个连续的字节序列一个接一个地流动而不是离散的、需要特殊处理的块。方向性流有明确的方向。输入流Input Stream数据从外部设备如键盘、文件流入程序的内存如同水汇入水库。输出流Output Stream数据从程序的内存流出到外部设备如屏幕、文件如同水从水库排出。抽象性程序员不再需要关心数据是来自速度缓慢的纸带还是快速的内存。他们只需要与“流”这个统一的接口打交道执行“读”从流中取水或“写”向流中放水的操作即可。这个“流”的比喻非常成功因为它将复杂的硬件差异屏蔽起来提供了一个简单、统一且易于理解的编程模型。 从Multics到C语言的传承C语言的设计深受Multics项目的影响。C语言的创造者之一肯·汤普逊Ken Thompson以及后来的丹尼斯·里奇Dennis Ritchie都参与了Multics项目或深受其思想启发。当他们设计Unix操作系统和C语言时继承并简化了Multics中强大的I/O抽象思想。Unix的“一切皆文件”Unix将“流”的思想进一步升华提出了“一切皆文件”的哲学。无论是普通文件、目录、键盘、显示器还是网络套接字在Unix看来都是一个可以进行读写的“文件”本质上就是一个数据流。C标准库的FILE*C语言的标准I/O库stdio.h将这一思想固化下来。FILE结构体它在内存中代表一个“流”内部封装了文件描述符、缓冲区、当前位置、错误状态等所有与该数据流相关的信息。stdin,stdout,stderr这三个预定义的FILE*指针就是程序启动时默认打开的三个标准“流”分别对应标准输入通常是键盘、标准输出通常是屏幕和标准错误通常是屏幕。fopen函数它的作用就是打开一个磁盘文件并在内存中为其创建一个FILE结构体返回一个指向它的指针。从此这个文件在程序眼中就和键盘、屏幕一样变成了一个可以读写的“流”。因此C语言中的“流”概念并非凭空创造而是对早期操作系统尤其是Multics中成熟I/O抽象模型的直接继承和标准化。这个名字之所以被沿用至今正是因为它精准地捕捉了数据在程序与外部世界之间连续、有序、单向流动的本质。