Stream(流)
流,抽象接口。例如:对http发请求的request对象就是一个流,stdout也是一个流。
流的四种类型:1.Readable可读操作 2.Writable可写操作 3.Duplex可读可写操作 4.Transform操作被写入数据,然后读结果
所有Stream对象都是EventEmitter的实例,常用事件:1.data:当有数据可读时触发 2.end:没有数据可读时触发 3.error:接受和写入的过程中发生错误时触发 4.finish:所有数据已被写入底层系统时触发
读取流
var fs = require('fs');
var data = '';
var readerStream = fs.createReadStream('input.txt'); //input.txt内容为你好
//创建了可读流
readerStream.setEncoding('UTF8'); //设置编码为utf8
readerStream.on('data',function(chunk){
data+=chunk; //回调函数带参数就是读到的数据
});
readerStream.on('end',function(){
console.log(data); //当没有数据可读,则输出data
});
console.log('程序执行完毕');
//结果:
程序执行完毕
你好
写入流
var fs = require('fs');
var data = '你好';
var writerStream = fs.createWriteStream('output.txt');
writerStream.write(data,'UTF8'); //专门有一个write函数,第一个传写入数据,第二个编码方式
writerStream.end(); //标记写入完成
writerStream.on('finish',function(){
console.log('写入完成')
})
writerStream.on('error',function(){
console.log(err.stack)
})
console.log('程序写入完成')
//结果:程序写入完成
写入完成
//cat output.txt (linux指令,看看output里面内容)
你好
管道流
有点类似中转站的概念,例如:我们从一个流中获取数据再将数据传递到另外一个流中
//input.txt内容:你好
var fs = require('fs');
var readerStream = fs.createReadStream('input.txt');
var writerStream = fs.createWriteStream('output.txt');
//管道操作,我们像是一个中转站,读取后再传给别的流
readerStream.pipe(writerStream);
console.log('程序执行完毕')
链式流
顾名思义,一路流下去,就是链式流,多个pipe
var fs = require('fs');
var zlib = require('zlib');
//意思:压缩input.txt变成input.txt.gz
fs.createReadStream('input.txt')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('input.txt.gz'));
console.log('文件压缩完成')
//顺便解压
fs.createReadStream('input.txt.gz')
pipe(zlib.createGunZip())
pipe(fs.createWriteStream('input.txt'));
console.log('文件解压完成');