Node pipe的实现

287 阅读1分钟

pipe

是什么

pipe的本质:是对on('data') write() end() close 的封装

做什么

  1. 监听可读流的触发事件,将获取到的数据 读取一点 写入一点,写入到可写流中
  2. 如果ws.write(data)返回false 则暂停读取,读取完毕后 触发drain事件,再继续读取,直到最终读取完毕,
  3. 如果需要操作读取到的数据,需要 使用 on('data)

实现

//可读流的class里直接新增pipe 方法
 pipe(ws) {
    // 谁调用 指向谁(实例)
    this.on("data", (data) => {
      let flag = ws.write(data);
      if (!flag) {
        //读取数量 超过highWaterMark 暂停
        this.pause();
      }
    });
    ws.on("drain", () => {
      // 缓存区 清空后 继续 读取文件
      this.resume();
    });
  }

调用

  • 经历了可写流和可读流的手写,pipe 是有一丢丢简单了
const bPath = path.join(__dirname, "b.txt");
const aPath = path.join(__dirname, "a.txt");
const createWriteStream = require("./initWriteStream");
const createReadStream = require("./initReadStream");
rs.pipe(ws);

最后如果觉得本文有帮助 记得点赞三连哦 十分感谢