名称 特点
Readable 可读
Writable 可写
Duplex 可读可写(双向)
Transform 可读可写(变化)

Readable

有静止态 paused 和 流动态 flowing,也就是可读流是支持停止的。

  • 默认处在 paused 态。
  • 如果监听了data事件,就会处于flowing态,也就是这里开始读。
  • 当然,把data事件删除了,就会变回 paused态。
  • Readable有两种方法可以控制流动的方法:
    • pause()可以变成paused方法。
    • resume()可以变成flowing方法。

例子如下:

  1. const server = http.createServer();
  2. server.on('request', (request, response) => {
  3. const stream = fs.createReadStream('./文件.txt');
  4. stream.pipe(response);
  5. stream.pause(); //先暂停写入
  6. setTimeout(() => {
  7. stream.resume(); //3秒后开始写入
  8. }, 3000)
  9. })

Writable

Writable控制停止写入很简单,就不写就行了,会等待数据写入。
重点注意的是drain事件与finish事件。
可以看这个:
Stream支持的事件

Duplex

如果说Readable,与Writable是单向通道,那么Duplex是双向通道,Duplex是即可读也可写,其实就是把Readable与Writable,如图
Stream分类 - 图1

即双向,但是注意,读和写是互不干扰的,开发者在写入的同时,读是读不到自己写入的内容。

Transform

即,写入的内容,读的时候是另一个内容,简单的例子就是日常开发安装的各种工具,都使用了Transform,如Babel,把ES6转ES5,Sass,把Sass代码转成css,Vue,React等等。

Stream分类 - 图2