对于stream模块我也是初步的认识,并没有做深入地了解,
如果有些地方不合适还请见谅!
一:首先我们要知道stream是什么?
翻译一下它的中文是小溪,流的意思。
所以说我们要这个Stream流的作用就是用来流动文件数据,
也就是对文件做一些操作;
Node.js 中的Stream(流)是一个抽象接口 ,
我们在学习Node.js中的时候会遇到很多Stream,
例如:对http服务器发起请求的request对象就是一个Stream,等等;
二:Steam的类型有哪些?
话说对于Stream流固然有其类型,就像水一样可以流入,也可以流出去;
Node.js中的Stream有四种流类型:
1:Readable-------可读操作
2:Writeable--------可写操作
3:Duplex------------可读可写操作
4:TransForm-------操作被写入数据,然后读出结果
我们可以根据自己的需要使用不同的流类型去操作数据流;
三:Stream对象常用的事件有哪些?
在前面我们已经知道了Stream是一个抽象接口,因此这个接口
必须要有自己的一些事件;
注:所有的Stream对象都是EventEmitter(核心是事件的监听和事件的绑定)的实例;
1:data-------当有数据可读时触发
2:end--------没有更多的数据可读时触发
3:error-------在接受数据和写入数据的时候发生错误时触发
4:finash------所有的数据已经被写入到底层系统时触发;
可以根据自己的需要为上面的事件设置相应的监听函数;
四:以上我们知道stream的几种类型,下面让我来具体的介绍一下
这几种类型的使用:
1:从流中读取数据:
要从流中读取数据,我们必须通过文件模块下的一个createReadStream函数创建一个可读流,
然后我们为需要读取的数据设置数据流的编码为utf8;
最后根据需要设置处理流事件----data,end,error
(要注意这几个事件的使用格式)
以下是具体的从流中读取数据的代码片段:
var fs=require('fs');
//实例化的readStream对象,创建可读流
readStream=fs.createReadStream('input.txt');
var data='';
//设置读取文件的格式,设置编码为utf8
readStream.setEncoding('utf8');
//注意所有的stream对象都是EventEmitter实例化的对象;
//为data设置事件的监听者(处理流事件---->data,end,error)
readStream.on('data',function(chunk){
data+=chunk;
});
//处理流事件end
readStream.on('end',function(){
console.log('数据读取完毕'+data);
});
//处理流事件error
readStream.on('error',function(error){
console.log(error.stack);
});
console.log('程序结束');
2:创建写入流,
通过文件模块下的createWriteStream函数去创建一个可写入流,注意其参数是存放写入数据的文件名;
然后使用wirte方法写入数据(编码格式设置为utf8);
var fs=require('fs');
var data="We must be win !";
//创建一个可以写入的流,写入到文件outPut.txt中
var writeStream=fs.createWriteStream('outPut.txt');
//使用utf8编码格式
writeStream.write(data,'utf8');
writeStream.end();
writeStream.on('finish',function(){
console.log('文件写入完成!');
});
writeStream.on('error',function(error){
console.log(error.stack);
});
console.log('程序结束');
3:管道流,
其实管道流就是使用读取流和写入流实现从一个流中获取数据传递到另一个流中;
var fs=require('fs');
//创建一个可读流对象(读取inout.txt文件里面的内容)
var readStream=fs.createReadStream('input.txt');
//创建一个可写流对象,(把文件内容写入到outPut2.txt文件中)
var writeStream=fs.createWriteStream('outPut2.txt');
//管道读写操作
//读取input.txt文件内容,并将内容写入到outPut2.txt文件中
readStream.pipe(writeStream);
console.log('程序结束');
4:链式流:
链式是通过连接输出流到另外一个流并创建多个流操作链的机制。
链式流一般用管道操作处理数据文件,
我们可以通过管道和链式结合用来压缩和解压文件;
这里我们要用到zilb这个node.js中的安装自带的模块,这里需要我们引入使用:
(1):文件的压缩:
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('压缩完成');
(2):文件的解压缩操作:
var fs=require('fs');
var zlib=require('zlib');
//解压input.txt.gz文件为input.txt
fs.createReadStream('input.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('input.txt'));
console.log('文件解压完成');
五:总结:
以上就是我目前对Stream流的一个基本认识;