//stream(流)是一个抽象接口,node中有很多对象实现了这个接口
//例如对http服务器发起请求的request对象就是一个stream
//四种流类型:
//Readable:可读
//Writeable:可写
//Duplex:可读写
//Transform:操作被写入数据然后读出结果
//所有stream对象都是EventEmitter的实例
//常用事件:
//data:有数据可读时触发
//end:没有更多数据可读时触发
//error:发生错误时触发
//finish:所有数据都已写入底层系统时触发
var fs =require('fs');
var data ='';
//创建可读流
var readStream =fs.createReadStream('kill.txt');
//设置编码为utf8
readStream.setEncoding('UTF8');
//处理流事件 data,end,error
//chunk可以理解为流数据中的一块数据,对可读流它是Stream读取的数据块,对可写流它是Stream写入的数据块。
readStream.on('data',function(chunk){
data += chunk;
})
readStream.on('end',function(){
console.log(data)
})
//stack:属性
readStream.on('error',function(err){
console.log(err.stack)
})
var data1 ='烦死了';
//创建写入流
var writeStream =fs.createWriteStream('kill.txt');
//写入 设置编码
writeStream.write(data1,'UTF8');
//处理流事件
writeStream.on('finish',function(){
//不知道为什么没有输出“写入完成”,但是数据是写进去了
console.log('写入完成')
})
//处理错误
writeStream.on('error',function(err){
console.log(err.stack)
})
//创建一个可写流
var writeStream1 =fs.createWriteStream('input.txt');
readStream.pipe(writeStream1);
//必须俩参数都写,否则只写data默认是err
fs.readFile('input.txt',function(err,data){
console.log(data.toString())
})
//链式流
var zlib =require('zlib');
//压缩input.txt文件为input.txt.gz
readStream.pipe(zlib.createGzip())
readStream.pipe(fs.createWriteStream('input.txt.gz'));
console.log('压缩完成')
fs.createReadStream('input.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('input.txt'));
console.log('解压完成')