nodejs之Stream(流)

来源:互联网 发布:cfd软件百花齐放论文 编辑:程序博客网 时间:2024/05/17 23:58
/*
Nodejs之Stream
Stream 是一个抽象接口,Node中有很多对象实现了这个接口。例如,对http服务器发起请求的request对象就是一个Stream,还有stdout
Nodejs-Stream 有四种流类型
Readable -表示可读操作
Writable -表示可写操作
Duplex -表示可读写操作 
Transform -操作被写入数据,然后读出结果
所有的Stream对象都是EventEmitter的实例,常用的事件有
data -当有数据可读时触发
end -没有更多数据可读的时候触发
error -在接受和写入过程中发生错误时触发
finish -所有数据已经被写入到底层系统时触发
从流中读取数据
栗子:
var fs = require("fs");
var data ='';
//创建可读流
var readStream = fs.createReadStream('input.txt');
//设置编码格式
readStream.setEncoding('UTF-8');
//处理流事件-->data 、end、error
readStream.on('data',function(chunk){
data += chunk;

});
readStream.on('end',function(chunk){
console.log(chunk);
});
readStream.on('error',function(chunk){
console.log(err.stack);

});

console.log("程序执行完毕");
写入流
栗子:
var fs = require("fs");
var data ="这是我的第一个nodejs的写入";
//创建一个写入流,写到文件output.txt中
var writeStream = fs.createWriteStream("output.txt");
//设置编码格式
writeStream.setEncoding("UTF-8");
//标记文件末尾
writeStream.end();
//处理流事件--data,end,error
writeStream.on('finish',function(){
console.log('写入完成');
});
writeStream.on('error',function(){
console.log(err.stack)

});
console.log("程序执行完毕");

管道流(主要是大文件的复制)
管道提供了输出流到输入流的机制,通常我们用于一个流中获取数据并将数据传递到另外一个流中
栗子:
var fs = require("fs");
//创建一个可读流
var readStream = fs.createReadStream('input.txt');
//创建一个可写流
var writeStream = fs.createWriteStream('output.txt');
//管道读写操作
//读取input.txt文件内容,并将内容写入到output.txt文件中
readStream.pipe(writeStream);
console.log("程序执行完毕");



链式流
链式是通过连接输出流到另外一个流并创建多个对个流操作的机制,
链式流一般用于管道操作

栗子:
//用管道和链式来压缩和解压文件
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("文件压缩完成");

//解压input.txt.gz 文件为input.txt 

fs.createReadStream('input.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('input.txt'));

console.log("文件解压完成")


*/