Bootstrap

node中的stream模块

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()
所有可以读取数据的流都继承自Stream.Readable,所有可以写入的数据都继承自Stream.Writeable


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})

;