Stream

181 阅读1分钟

Stream - 流

释义

  • stream 是水流,但默认没有水
  • stream.write 可以让水流中有水(数据)
  • 每次写的小数据叫做 chunk(块)
  • 产生数据的一段叫做 source(源头)
  • 得到数据的一段叫做 sink(水池)

管道

释义

  • 两个流可以用一个管道相连
  • stream1 的末尾连接上 stream2 的开端
  • 只要 stream1 有数据,就会流到 stream2

常用代码

stream1.pipe(stream2)

链式操作

a.pipe(b).pipe(c)
// 等价于
a.pipe(b)
b.pipe(c)

Stream 对象的原型链

s = fs.createReadStream(path)

  • 那么它的对象层级为
  • 自身属性(由 fs.ReadStream 构造)
  • 原型:stream.Readable.prototype
  • 二级原型:stream.Stream.prototype
  • 三级原型:events.EventEmitter.prototype
  • 四级原型:Object.prototype

Stream 对象都继承了 EventEmitter

支持的事件和方法

image.png

Stream 分类

image.png

Readble Stream

静止态 paused 和 流动态 flowing

  • 默认处于 paused 态
  • 添加 data 事件监听,它就变为 flowing 态
  • 删掉 data 事件监听,它就变为 paused 态
  • pause() 可以将它变为 paused
  • resume() 可以将它变为 flowing

Writable Stream

drain 流干了事件

  • 表示可以加点水了
  • 我们调用 stream.write(chunk) 的时候,可能会得到 false
  • false 的意思是你写的太快了,数据积压了
  • 这个时候我们就不能再 write 了,要监听 drain
  • 等 drain 事件触发了,我们才能继续 write

finish 事件

  • 调用 stream.end() 之后
  • 缓冲区数据都已经传给底层系统之后
  • 触发 finish 事件