首页 技术 正文
技术 2022年11月20日
0 收藏 819 点赞 2,843 浏览 3388 个字

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("哈哈");

可以在终端打印出指定内容

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,071
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,549
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,397
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,174
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,809
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,889