11.24 stream流

EventEmitter

Stream(流)

  • Readable - 可读流 (fs.createReadStream)

  • Writeable - 可写流(fs.createWriteStream)

  • Duplex - 可读写流(双工流)

  • Transform - 转换流 - 在读写过程中改变和变换数据 Duplex

  • 单工 - 数据只允许在一个方向上传输,

  • 半双工 - 数据允许在两个方向上传输 , 但是同一时间内 只可以一方发送或接受消息

  • 全双工 - 同时可以进行双向传输 - TCP

  • node中使用数据流时触发的事件:每个数据流都有一个EventEmitter实例,该实例
         的作用是触发事件。
     (1)data —- 当流中有数据可读取时触发。data是事件名

    ​ (2)end —- 当流中没有数据时触发。end是事件名

    ​ (3)error —- 当有任何错误触发。error是事件名

    ​ (4)finish —- 当所有数据已刷新到底层系统时触发。finish是事件名 

可读流工作在两种模式下
 *  flowing  (自动流)
 *  paused  (暂停模式) 如果要读取数据 就必须显示的调用 stream.read() 方法
 *  所有 paused 流 ,都可以通过下面三种途径,切换到 flowing 模式
 *  监听 data 事件
 *  调用 stream.resume()
 *  调用 stream.pipe(xxx)
 */
const fs = require("fs");

/**
 * encoding : 编码
 * fd:文件描述符
 * autoClose:true
 * start: 读取文件的其实位置
 * end: 读取文件的结束位置(包含结束位置)
 * highWaterMark 最大读取文件的字节数  默认值 64 * 1024;
 */
let rs = fs.createReadStream("big.txt", {
  start: 0,
  highWaterMark: 3,
});
let array = [];
rs.on("data", (data) => {
  array.push(...data);
  rs.pause(); //暂停 进入paused
  console.log("暂停模式", array.length);
  setTimeout(() => {
    console.log("恢复了");
    rs.resume(); // paused -> flowing
  }, 100);
});

rs.on("open", () => {
  console.log("文件打开了");
});
rs.on("close", () => {
  console.log("文件关闭了");
});

rs.on("error", (err) => {
  console.log("触发错误了", rr);
});
rs.on("end", () => {
  console.log("读完了");
  array = null;
  console.log(Buffer.from(array).toString());
});
可写流
* encoding : 编码
 * fd:文件描述符
 * autoClose:true
 * start: 读取文件的其实位置
 * end: 读取文件的结束位置(包含结束位置)
 * highWaterMark 一个对比写入字节数的标识 16 * 1024
 */

const fs = require("fs");

let ws = fs.createWriteStream("xxx.txt",{
  highWaterMark:2
});
let flag1 = ws.write("1")
let flag2 = ws.write("2")
let flag3 = ws.write("3")

ws.write("6")
ws.write("7")
ws.write("8")
//当写入内容大于等于 highWaterMark
ws.on("drain",()=>{
  console.log("吸干了")
  ws.end();
})



console.log(flag1,flag2,flag3)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值