Unix 操作系统中引入的,程序可以通过管道运算符(|)对流进行相互交互。
使用流,则可以逐个片段地读取并处理(而无需全部保存在内存中)。
Node.js 的 stream 模块 提供了构建所有流 API 的基础。 所有的流都是 EventEmitter 的实例。
为什么是流? 相对于使用其他的数据处理方法,流基本上提供了两个主要优点:
内存效率: 无需加载大量的数据到内存中即可进行处理。 时间效率: 当获得数据之后即可立即开始处理数据,这样所需的时间更少,而不必等到整个数据有效负载可用才开始
一个典型的例子是从磁盘读取文件。
使用 Node.js 的 fs 模块,可以读取文件,并在与 HTTP 服务器建立新连接时通过 HTTP 提供文件:
流驱动的 Node.js API 许多 Node.js 核心模块提供了原生的流处理功能 process.stdin 返回连接到 stdin 的流。 process.stdout 返回连接到 stdout 的流。 process.stderr 返回连接到 stderr 的流。 fs.createReadStream() 创建文件的可读流。 fs.createWriteStream() 创建到文件的可写流。 net.connect() 启动基于流的连接。 http.request() 返回 http.ClientRequest 类的实例,该实例是可写流。 zlib.createGzip() 使用 gzip(压缩算法)将数据压缩到流中。 zlib.createGunzip() 解压缩 gzip 流。 zlib.createDeflate() 使用 deflate(压缩算法)将数据压缩到流中。 zlib.createInflate() 解压缩 deflate 流。
不同类型的流 Readable: 可以通过管道读取、但不能通过管道写入的流(可以接收数据,但不能向其发送数据)。 当推送数据到可读流中时,会对其进行缓冲,直到使用者开始读取数据为止。 Writable: 可以通过管道写入、但不能通过管道读取的流(可以发送数据,但不能从中接收数据)。 Duplex: 可以通过管道写入和读取的流,基本上相对于是可读流和可写流的组合。 Transform: 类似于双工流、但其输出是其输入的转换的转换流。
如何创建可读流 从 stream 模块获取可读流,对其进行初始化并实现 readable._read() 方法。