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
支持的事件和方法
Stream 分类
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 事件