//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(
'解压完成')