一、Stream流简要介绍
- Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。
- Node.js Stream 有四种流类型:
- 所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:
二、从流中读取数据
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("读取完成");
})
三、写入流
let fs=require("fs");
let path='./text/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");
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");
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");
readStream.pipe(zlib.createGunzip()).pipe(writeStream);