stream是node提供的又一个仅在服务区端可用的模块,目的是支持流这种数据结构。
流是一种抽象的数据结构(标准输入流/标准输出流),可以用来读取和写入数据。
在node中,流也是一个对象,我们只需要响应流的事件就可以了:data事件表示流的数据已经可以读取了,end事件表示这个流已经到末尾了, error事件表示出错了。
'use strict'
var
fs =
require(
'fs');
//打开一个流
var
rs =
fs.
createReadStream(
'example.txt',
'utf-8');
rs.
on(
'data',
function(
chunk) {
console.
log(
'DATA');
console.
log(
chunk)
})
rs.
on(
'end',
function() {
console.
log(
'END')
})
rs.
on(
'error',
function(
err) {
console.
log(
'ERROR'+
err)
})
要注意,data事件可能会有多次,每次传递的chunk是流的一部分数据。
要以流的形式写入文件,只需要不断调用write()方法,最后以end()
var
ws1 =
fs.
createWriteStream(
'example.txt',
'utf-8');
ws1.
write(
'调用stream写入数据-1...
\n
');
ws1.
write(
'调用stream写入数据-2...
\n
');
ws1.
write(
'调用stream写入数据-3...
\n
');
ws1.
end();
var
ws2 =
fs.
createWriteStream(
'example.txt',
'utf-8');
ws2.
write(
new
Buffer(
'使用stream写入二进制数据',
'utf-8'));
ws2.
write(
new
Buffer(
'END',
'utf-8'));
ws2.
end()
pipe:一个Readable流和一个Writeable流串起来之后,所有的数据自动从Readable流进入Writeable流,这种操作叫pipe,在node中Readable流有一个pipe()方法就是用来干这件事的。
var
rs3 =
fs.
createReadStream(
'example.txt',
'utf-8');
var
ws3 =
fs.
createWriteStream(
'a.txt',
'utf-8');
rs3.
pipe(
ws3);
默认情况下,当Readable流的数据读取完毕,end事件触发后将自动关闭Writeable流,如果我们不希望Writeable流自动关闭,需要传入参数:
Readable.pipe(Writeable,{end:false})