Node.js Stream(流)

274 阅读2分钟
定义

Stream 是Node.js中处理流式数据的抽象接口,stream 模块提供了用于实现流接口的 API。Node.js提供了许多流对象,例如,对HTTP服务器的请求和 process.stdout 都是流的实例。所有的流都是EventEmitter的实例。

类型

此外,该模块还包括实用函数 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 - 所有数据已被写入到底层系统时触发。