定义
Stream 是Node.js中处理流式数据的抽象接口,stream 模块提供了用于实现流接口的 API。Node.js提供了许多流对象,例如,对HTTP服务器的请求和 process.stdout 都是流的实例。所有的流都是EventEmitter的实例。
类型
- Writable - 可写入数据的流(例如客户端上的 HTTP 请求、服务器上的 HTTP 响应、文件系统写入流、压缩流、加密流、TCP 套接字、子进程标准输入、process.stdout、process.stderr)。
- Readable - 可读取数据的流(例如客户端上的 HTTP 响应、服务器上的 HTTP 请求、文件系统读取流、压缩流、加密流、TCP 套接字、子进程的标准输出和标准错误、process.stdin)。
- Duplex - 同时拥有Writable 和 Readable 的双工流(例如TCP 套接字、压缩流、加密流),维护两个独立的内部缓冲区,用于读取和写入的独立操作。
- Transform - 在读写过程中可以修改或转换数据的 Duplex 流(例如压缩流、加密流),维护两个独立的内部缓冲区,用于读取和写入的独立操作。
此外,该模块还包括实用函数 stream.pipeline()、stream.finished()、stream.Readable.from() 和 stream.addAbortSignal()。
对象模式
Node.js API 创建的流默认只对字符串和Buffer (或 Unit8Array)对象进行操作。流的操作可也以使用其他类型的js值(null除外,null被视为无效及被视为要结束流的信号等),可通过设置objectMode为真来接受任意JavaScript值,如{},[]。
缓冲
- Writable和Readable 流都将数据存储在内部缓冲区中,缓冲的数据量取决于传给流的构造函数的 highWaterMark选项。
- Duplex 双工流和 Transform 维护两个独立的内部缓冲区,用于独立高效的读取和写入操作,例如,net.Socket 实例是 Duplex 流,其 Readable 端允许消费从套接字接收的数据,其 Writable 端允许将数据写入套接字。 因为数据可能以比接收数据更快或更慢的速度写入套接字,所以每一端都应该独立于另一端进行操作(和缓冲)。
事件
所有的流都是EventEmitter的实例。常用的事件有:
- data - 当有数据可读时触发。
- end - 没有更多的数据可读时触发。
- error - 在接收和写入过程中发生错误时触发。
- finish - 所有数据已被写入到底层系统时触发。