如下:

Readable Stream Readable Stream
事件 data、end、error、close、readable drain、finish、error、close、pipe、unpipe
方法 pipe()
unpipe()
wrap()
destroy()
read()
unshift()
resume()
pause()
isPaused()
setEncoding()
write()
destroy()
end()
cork()
uncork()
setDefaultEncoding()

可读流事件(Readable Stream)

可读流有两种状态:

  • paused状态(默认状态)
  • flowing状态

在还没有添加data事件前,该流会变成flowing状态,删除data事件后,就会变回paused状态。

data事件与end事件

data事件会将流送到需要到达的地方,该流是一个字符串或者 Buffer,该事件会在数据传送到的时候触发。
end事件会在流传送结束的时候,也是就完全没有流时,就会触发。

error事件

在任何时候都有可能触发,只要有错误出现,就会触发该事件

close事件

在流或者文件关闭后触发,之后将不再触发任何事件。

readable.pipe()方法

数据写入目标,如 stream.pipe(stream2).pipe(stream3)

readable.read()方法

读取流的数据

可写流(Readable Stream)

drain事件

当流流干的时候,就会触发该事件。

场景1:stream1 流数据到 stream2 时,假如读写速度特别快,或者读写时间很长,就很可能会出现流的速度很快,导致通过管道的时候出现“堵车”的情况,就不会继续往下读,如下代码

  1. //假如steam1一有了数据,就立马传给了stream2
  2. stream1.on('data', (chunk) => {
  3. stream2.write(chunk)
  4. })
  5. //stream1停了,stream2就停
  6. stream1.on('end', () => {
  7. stream2.end()
  8. })

会很容易造成堵车情况,这时候我们可以停止该流的流入,转而监听事件,如下:

  1. //假如steam1一有了数据,就立马传给了stream2
  2. stream1.on('data', (chunk) => {
  3. const flag = stream2.write(chunk) //该flag,会得到true、false
  4. //false表示数据堆积,写太快了,撑不下,这个时候需要监听 drain 事件
  5. if(flag === false){
  6. //当数据不积压的时候,就是流干了,会触发该事件
  7. stream2.on('drain', () => {
  8. //继续写
  9. })
  10. }
  11. })
  12. //stream1停了,stream2就停
  13. stream1.on('end', () => {
  14. stream2.end()
  15. })

finish事件
如果说 drain事件是某段某段写完后就会触发,那么 finish就是全部写完后才会触发。
注意的是,该事件会在 stream.end()之后,且在缓冲区数据都已经传给底层系统之后,才会触发finish。

pipe事件

有人往stream2插入管道,就会触发该事件。

unpipe事件

与pipe事件相反,就是移除管道。

write方法

就是写东西,如stream2.write(cheunk),往stream写入数据。