node I/O流(背压问题)

关于IO流

fs.createReadStream()创建一个可读流

创建一个可读流

//接收两个参数
//文件路径
//配置
const rs = fs.createReadStream(filename, {
  encoding: "utf-8",
  highWaterMark: 1,//每一次读取的数量,如果encoding===null,就是一个字符,如果是utf-8就是一个文字字符
  autoClose:true //完成时自动关闭
});
//使用on函数注册事件
//可以触发的事件
//open  打开之后触发
//error  文件出错了(一般是路径写错了)
//close   文件关闭后触发
//data    只有注册了这个事件才会真正开始读取内容,读取到内容后触发,返回读取到的内容
//end     d
//如果要读取全部的数据保存到内存中的话,不如直接用fs.readFile()
//rs.pause()  暂停读取  会触发pause事件
//rs.resume()  恢复读取  会触发resume事件
rs.on("data",chunk=>{
  console.log("读取到了文件"+chunk)
}) //只有运行了这个才会开始读取文件不然就不会读取文件 

fs.createWriteStream()创建一个写入流
const path = require("path");
const fs = require("fs");

const filename = path.resolve(__dirname, "./abc.text");

const ws = fs.createWriteStream(filename, {
  flags: "a",  //如何对文件进行操作
  highWaterMark: 2,  //每一次读取的数量,如果encoding===null,就是一个字符,如果是utf-8就是一个文字字符
  autoClose: true,
  start:1  //起始位置
});

const data = "123456";
ws.write(data);//写入一些数据
//可以穿字符串也可以传buffer,返回一个布尔值(返回的时true的话表示写入通道没有被tian),当写入队列清空时,会触发drain事件

ws.on("open", () => {
  console.log("写入开始了");
});
// 注册事件ws.on('事件',callback)
//open事件
//error事件
//close事件
//drain事件
ws.on("close", () => {
  console.log("写入结束了");
});
ws.end();

ws.write(data)会返回一个布尔值(磁盘的写入速度和内存比是很慢的)当写入通道没满时ws.write(data)会返回true,后面的写入就不用排队可以直接写入,反之就是写入通道被占满了,接下来的数据会进入写入队列

背压问题:

​ 造成原因:内存速度太快了,但是磁盘写入很慢,很多要写入的东西都积压在写入队列,造成很大的内存空间占用。因为写入队列是内存中的数据,是有限的,可以使用drain事件来解决这个问题,这个事件会在当原来是满的时候,当写入队列清空时,会触发drain事件,如果本来就没有满,就算清空了也不会触发事件

防止背压的写入方法

async function method2() {
  const from = path.resolve(__dirname, "./abc.text");
  const to = path.resolve(__dirname, "./cba.text");
  const rs = fs.createReadStream(from);
  const ws = fs.createWriteStream(to);
  rs.on("data", (chunk) => {
    const flag = ws.write(chunk);
    if (!flag) {
      rs.pause();
    }
  };
  ws.on("drain", () => {
    rs.resume();
  }) //可以简写为rs.pipe(ws)
}
//直接使用rs.pipe(ws)就可以完成上面的操作

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值