nodejs基础(管道、流)实现:复制、压缩、加密、解压,解密,写入文件
stream流 都是events.EventEmitter的一个实例,都可以来创建自定义事件(也就是说,流是一个事件的实例)
在nodejs中 对http的请求与响应都是用流来实现的,请求就是一个输入的流,响应就是一个输出的流
使用stream流,可以提高性能,前面说的读写文件,是一次性把文件放在内存中,这样就不大合适了,而stream流,是将读取的文件放在Buffer(缓存)中。就是一边放,一边处理,steam流有两个好处,就是处理数据和提高性能。
下面来实现一个流:
var fs = require('fs'); var myReadStream = fs.createReadStream(__dirname+"/readMe.txt","utf8");//创建一个读取流的实例 var data="";//创建一个变量来接收文件 myReadStream.on("data",function(chunk){//data是在接收数据的时候用的监听函数 当文件很大时,是把文件分成很多Buffer来接收的 所以这个函数可能执行多次 data+=chunk; }) myReadStream.on("end",function(){//end是接收完毕后的监听函数 console.log(data); })
上诉代码,如果不设置编码为utf8,data值将会为Buffer,看着是一串数字
当然,还可以另一种设置编码的方式:
var myReadStream = fs.createReadStream(__dirname+"/readMe.txt");//创建一个读取流的实例 myReadStream.setEncoding("utf8");//设置编码 var data="";//创建一个变量来接收文件 myReadStream.on("data",function(chunk){//data是在接收数据的时候用的监听函数 当文件很大时,是把文件分成很多Buffer来接收的 所以这个函数可能执行多次 data+=chunk; }) myReadStream.on("end",function(){//end是接收完毕后的监听函数 console.log(data); })
在原来的基础上写一个写入流:
var myReadStream = fs.createReadStream(__dirname+"/readMe.txt");//创建一个读取流的实例 var myWriteStream = fs.createWriteStream(__dirname+"/writeMe.txt");//创建一个写入流 myReadStream.setEncoding("utf8");//设置编码 myReadStream.on("data",function(chunk){//data是在接收数据的时候用的监听函数 当文件很大时,是把文件分成很多Buffer来接收的 所以这个函数可能执行多次 myWriteStream.write(chunk);//将读取到的片段写入,参数就是要写入的内容 }) myReadStream.on("end",function(){//end是接收完毕后的监听函数 })
写入流 还有一种用法
var myWriteStream = fs.createWriteStream(__dirname+"/writeMe.txt");//创建一个写入流 var writeData = "hello world"; myWriteStream.write(writeData);//写入 myWriteStream.end();//写入完之后调用end方法 (调用这个方法是 代表这个流结束了,如果不掉用这个流,这个流是结束不了的,finish方法不会触发) myWriteStream.on("finish",function(){//加一个监听函数,监听撸结束后 console.log("finished"); })
管道的使用pipe
用管道来实现赋值文件会非常简单:
var fs = require('fs'); var myReadStream = fs.createReadStream(__dirname+"/readMe.txt");//创建一个读取流的实例 var myWriteStream = fs.createWriteStream(__dirname+"/writeMe.txt");//创建一个写入流 myReadStream.pipe(myWriteStream);//使用管道 将读取流和写入流连接到一起
下面来上一个真实的代码,读取文件,加密,压缩,然后写入
var crypto = require("crypto");//用来加密 var fs = require("fs"); var zlib = require("zlib");//用来压缩 var password = new Buffer(process.env.PASS || "password"); var encryptStream = crypto.createCipher('aes-256-cbc',password); var gzip = zlib.createGzip(); var readStream = fs.createReadStream(__dirname+"/readMe.txt"); var writeStream = fs.createWriteStream(__dirname+"/out.gz"); readStream//读取 .pipe(encryptStream)//加密 .pipe(gzip)//压缩 .pipe(writeStream)//写入 .on("finish",function(){//写入结束的回调 console.log("done"); })
下面将上面代码压缩出来的out.gz文件解压,解密,然后输出到终端
var crypto = require("crypto");//用来加密 var fs = require("fs"); var zlib = require("zlib");//用来压缩 var password = new Buffer(process.env.PASS || "password"); var decryptStream = crypto.createDecipher('aes-256-cbc',password); var gzip = zlib.createGunzip();//解压 var readStream = fs.createReadStream(__dirname+"/out.gz"); readStream//读取 .pipe(gzip)//解压 .pipe(decryptStream)//解密 .pipe(process.stdout)//输出到终端中 标准输出 .on("finish",function(){//解压后的回调 console.log("done"); })
上面的代码稍微更改一下,将解密,解压出来的文件写入到deOut.txt文件中
var crypto = require("crypto");//用来加密 var fs = require("fs"); var zlib = require("zlib");//用来压缩 var password = new Buffer(process.env.PASS || "password"); var decryptStream = crypto.createDecipher('aes-256-cbc',password); var gzip = zlib.createGunzip();//解压 var readStream = fs.createReadStream(__dirname+"/out.gz"); var writeStream = fs.createWriteStream(__dirname+"/deOut.txt"); readStream//读取 .pipe(gzip)//解压 .pipe(decryptStream)//解密 .pipe(writeStream)//将解密,解压的文件写入到deOut.txt文件中 .on("finish",function(){//解压后的回调 console.log("done"); })
小知识:
process.stdout.write("哈哈");
可以在终端打印出指定内容
分类:
node
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通