基础

梗概:

Stream 是一个抽象接口,实现了[base::]的数据类型 ,Node 中有很多对象实现了这个接口。 例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。

1. Stream的四种类型:

Node.js,Stream 有四种流类型:

  • Readable - 可读操作。
  • Writable - 可写操作。
  • Duplex - 可读可写操作.
  • Transform - 操作被写入数据,然后读出结果。

Stream的数据单元:

  1. 默认为一个字节
  2. 可以设置为一个字符

1. 数据单元的容量:

^3e6bbd 2. 表示流的最大体积,单位为KB, 默认为64* 1024

  1. 流在被创建的时候, 可以设置highWaterMark属性

相关概念:

所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:

  • data - 当有数据可读时触发。
  • end - 没有更多的数据可读时触发。
  • error - 在接收和写入过程中发生错误时触发。
  • finish - 所有数据已被写入到底层系统时触发。
  • close - 某个流被关闭

机制:

1. 读取流:

  1. 有多种方法可以使用读取流中的数据, 但只能同时使用一种, 否则可能产生错误
    1. 添加'data'事件监听器, 自动流动数据
    2. 通过 pipe() 自动流入到其他流中
    3. 监听readable事件, 手动控制流动

2. 自动读取流:

2.1. 以下操作会开启读取流自动流动:

手动切换:

  1. readable.resume() 切换为自动流动

自动切换:

  1. 添加了'data'事件监听器
    1. 注意移除了'data'监听器之后, 自动流并不会自动关闭, 这时就会丢失数据
  2. 使用stream.pipe()把读取流输入进其他流
  3. 移除了readable事件监听器

3. 关闭自动读取流:

3.1. 以下操作会关闭自动流动:

手动切换:

  1. stream.pause()
    1. 当然如果已经连接有其他流, 当其他流重新索求数据流时, 又会重新开启自动流

自动切换:

  1. 管道连接断开
  2. 添加readable事件监听器

3.2. 手动流动读取流:

  1. 监听readable事件, 通过事件方法readable.read(), 手动流动

语法:

1. 梗概:

1.1. 读取流:

  1. var readerStream = fs.createReadStream('文件路径') 创建实例对象, 确定源
  2. readerStream.on('data', function(数据单位){}) 为流中数据更新注册事件, 以截取数据
  3. readerStream.on('end',function(){}) 监听数据读取完毕的事件, 处理收集到的数据

1.2. 写入流:

  1. var writerStream = fs.createWriteStream('文件路径') 创建实例对象, 确定目标
  2. writerStream.write(data,'编码格式') 将数据写入流中
  3. writerStream.on('finish', function(){} 监听数据写入完毕的事件

2. 详细语法:

  1. child::Stream数据类型 语法
  2. [ 菜鸟教程](https://www.runoob.com/nodejs/nodejs-stream.html|Node.js Stream(流) | 菜鸟教程](流)%20)