Node.js Stream(流)

一、Stream流简要介绍

  • Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。
  • Node.js Stream 有四种流类型:
    在这里插入图片描述
  • 所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有
    在这里插入图片描述

二、从流中读取数据

// 引入fs文件系统模块
let fs=require("fs");
// 创建读取流
let readStream=fs.createReadStream('./text/data.txt');
// 设置流的编码格式
readStream.setEncoding('utf-8');
// 总数据
let alldata="";
// 使用事件监听读取流数据
readStream.on('data',(data)=>{
   alldata+=data;
});
readStream.on('end',()=>{
   // 读取数据完成
   console.log(alldata);
});
// 读取报错
readStream.on('error',(err)=>{
   if(err){
       throw err.stack;
   }
});
// 读取完成
readStream.on('finish',()=>{
   // 最终处理的代码
   console.log("读取完成");
})
  • 以上代码会读取data.txt文件中的所有数据。

三、写入流

// 引入fs文件系统模块
let fs=require("fs");
let path='./text/error.txt';
// 创建写入流,写入error.txt文件
let writeStream=fs.createWriteStream(path,['r+','utf-8']);
// 准备写入的数据
let str="error";
writeStream.write(str,'utf-8',(error)=>{
   if(error){
       throw error;
   }
});
// 关闭当前流
writeStream.end();

writeStream.on('finish',()=>{
   console.log("数据完成");
})
  • 以上代码会将 str变量的数据写入到 error.txt 文件中。

四、管道流

  • 管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。
    在这里插入图片描述
  • 把文件比作装水的桶,而水就是文件里的内容,我们用一根管子(pipe)连接两个桶使得水从一个桶流入另一个桶,这样就慢慢的实现了大文件的复制过程。
  • 简单来说,就是通过读取一个文件内容并将内容写入到另外一个文件中。
// 管道流,边读边写
const fs=require("fs");
// 创建一个可读流
let read=fs.createReadStream("./text/data.txt");
// 创建一个可写流
let write=fs.createWriteStream("./text/error.txt");
// 管道读写操作
// 读取data.txt文件内容,并将内容写入到error.txt文件中
read.pipe(write);

五、链式流

  • 链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。
  • 接下来我们就是用管道和链式来压缩和解压文件。
// 创建链式流
const fs=require("fs");
// 创建压缩的模块
const zlib=require("zlib");
// 创建输出流
let readStream=fs.createReadStream("./text/data.txt");
// 创建写入流
let writeStream=fs.createWriteStream("./text/data.zip");
// 压缩data.txt文件为data.zip
readStream.pipe(zlib.createGzip()).pipe(writeStream);
  • 执行完以上操作后,我们可以看到当前目录下生成了 data.txt 的压缩文件 data.zip。
  • 解压该文件
const fs=require("fs");
const zlib=require('zlib');
let readStream=fs.createReadStream("./text/data.zip");
let writeStream=fs.createWriteStream("./text/data.txt");
// 解压data.zip为data.txt
readStream.pipe(zlib.createGunzip()).pipe(writeStream);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南初️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值