node源码实现——pipe

pipe作用

1
readable.pipe(destination, [options])
  • 该方法从可读流中拉取所有数据,并写入到所提供的目标。该方法能自动控制流量以避免目标被快速读取的可读流所淹没。

    功能点分析

  1. 该方法实现了一个可读流向一个可写流数据的写入
  2. 这种写入方法可以控制liul

    实现原理

  3. 定义可读流与可写流,监听data事件当数据读入缓存后写数据
  4. 判断可写流是否超过写的限制。如果超过,暂停数据读入。并监听可写流drain事件判断数据是否写入。
  5. 数据写入后恢复数据读入,并循环第一步。
  6. 监听可读流end事件,当数据读入完毕,将缓存区的数据强制写入。

    代码实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    function pipe1 (source,target) {
    var fs=require('fs');
    var ws=fs.createWriteStream(target);
    var rs=fs.createReadStream(source);
    var flag=true;
    //监听data,开始读取数据
    rs.on('data',function (data) {
    //写入数据
    flag=ws.write(data,function (err) {
    console.log(err);
    });
    //如果无法写入,暂停读入
    if (!flag) {
    rs.pause();
    }
    })
    //监听drain事件,判断是否写入完毕
    ws.on('drain',function () {
    rs.resume();
    })
    //监听end,判断读入完毕,将数据强制写入
    rs.on('end',function (data) {
    ws.end(data);
    })
    //错误监听
    rs.on('error',function (err) {
    console.log(err);
    })
    }