stream是Node.js提供的一个仅在服务区端可用的模块,目的是支持“流”这种数据结构。
在Node.js中,流也是一个对象,我们只需要响应流的事件就可以了:data事件表示流的数据已经可以读取了,end事件表示这个流已经到末尾了,没有数据可以读取了,error事件表示出错了。
1、从文件流读取文本内容
'use strict';
var fs = require('fs');
//打开一个流
var rs = fs.createReadStream('readFile.txt','utf-8');
rs.on('data',function(data){
console.log('read data');
console.log(data);
})
rs.on('end',function(){
console.log('END');
})
rs.on('error',function(err){
console.log('ERROR' + err);
})
2、以流的形式写入文件
'use strict';
var fs = require('fs');
var ws1 = fs.createWriteStream('readFile.txt','utf-8');
ws1.write('写入1 \n');
ws1.write('写入2 \n');
ws1.write('写入3 \n');
ws1.write('写入=4');
//结束写入
ws1.end();
写入文件的内容如下:
写入1
写入2
写入3
写入=4
所有可以读取数据的流都继承自stream.Readable,所有可以写入的流都继承自stream.Writable。
3、pipe
就像可以把两个水管串成一个更长的水管一样,两个流也可以串起来。一个Readable流和一个Writable流串起来后,所有的数据自动从Readable流进入Writable流,这种操作叫pipe。
下面代码是把readFile.txt 文件内容复制到 copied.txt 文件中。
'use strict';
var fs = require('fs');
var rs = fs.createReadStream('readFile.txt');
var ws = fs.createWriteStream('copied.txt');
rs.pipe(ws);
默认情况下,当Readable流的数据读取完毕,end事件触发后,将自动关闭Writable流。如果我们不希望自动关闭Writable流,需要传入参数:
rs.pipe(ws, { end: false });