今天起得晚,发现我的博客排名上升到5位数了,激动之情难以言表,只有再写一篇博客来巩固自己的地位(以上内容与本文无关,轻喷~)
之前说过,nodejs操作文件可以用fs系统来实现,不过这样操作的原理是对整个文件的复制粘贴。对整体的操作,所以对于大型文件,这无疑是一种折磨,所以今天介绍流操作,可以有效的避免这种烦恼。
流(stream),即分段操作、流式操作,可以减少内存占用,提高效率
基础知识
Readable---可读操作
Writable---可写操作
Duplex---可读可写操作
Transfrom---操作被写入数据,然后读出结果
所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:(类似vue的生命周期理解)
data - 当有数据可读时触发。
end - 没有更多的数据可读时触发。
error - 在接收和写入过程中发生错误时触发。
finish - 所有数据已被写入到底层系统时触发。
实践
流 读取
// 从流中取出数据
var fs=require('fs');
// 设置读取的数据(初始化)
var data="";
// 创建流
var readStream=fs.createReadStream("./content.txt");
// 设置编码格式
readStream.setEncoding("UTF-8");
// 处理流的事件
// 1.当有数据的时候触发
readStream.on("data",function(res){
data+=res;
});
// 当没有数据的时候触发
readStream.on("end",function(){
console.log(data);
});
// 当读取文件错误时触发
readStream.on("error",function(err){
console.log(err);
});
console.log("读取完成");
流 写入(覆盖写法,下面会说如何改为追加写法)
var fs=require('fs');
// 写入的内容
var text="just do it";
// 创建流
var writerSteam=fs.createWriteStream("content.txt");
// 设置格式
writerSteam.write(text,"UTF-8");
结束
writerSteam.end();
writerSteam.on("finish",function(){
console.log("写入完成");
});
管道 流
关于管道 流,可以这样理解:就像是从一个桶里往另一个桶中抽水一样,中间用水管连接,把数据看作是桶里面的水
// 管道流(流对流的传递)
// 覆盖写法
var fs=require('fs');
var readStream1=fs.createReadStream("content.txt");
var writeStream2=fs.createWriteStream("./upload/1.txt");
readStream1.pipe(writeStream2);
// 追加写法(替换即可)
// 添加参数(流 写入同样适用)
var writeStream2=fs.createWriteStream('./upload/1.txt', { 'flags': 'a' });
两种写法的效果