简介
在node中,一共有五种类型的流:readable,writable,transform,duplex以及'classic'。
无论哪一种流都会使用.pipe()方法实现输入和输出。
.pipe()函数接受一个源头src并将数据输出到一个可写的流dst中:
src.pipe(dst);
.pipe(dst)将会返回dst因此你可以链式调用多个流:
a.pipe(b).pipe(c).pipe(d);
readable流
readable流可以产生数据,你可以将这些数据传送到一个writable,transform后者duplex流中,只需要调用pipe()方法:
readableStream.pipe(dst);
创建一个readable流
var Readable = require('stream').readable;
var rs = new Readable;
rs.push('beep');
rs.push('boop ');
rs.push(null);
rs.pipe(process.stdout);
rs.push(null)的作用是告诉rs输出数据应该结束了。
rs.push中的数据一直存在缓存中。
var Readable = require('stream').Readable;
var rs = Readable();
var c = 97;
rs._read = function(){
rs.push(String.fromCharCode(c++));
if(c > 'z'.charCodeAt(0)){
rs.push(null);
}
};
消耗一个readable流
大部分时候,将一个readable流直接pipe到另一个类型的流或者使用through或者concat-stream创建的流中,是一件很容易的事情。但是有时候我们也需要直接消耗一个readable流。
writable流
一个writable流指的是只能流进不能流出的流。
src.pipe(writableStream)
创建一个writable流
只需要定义一个._write(chunk.enc.next)函数,你就可以将一个readable流的数据释放到其中:
var writable = require('stream').writable;
var ws = writable();
ws._write = function(chunk,enc,next){
console.dir(chunk);
next();
};
向一个writable流中写东西
如果你需要一个writable流中写东西,只需要调用.write(data)即可。
为了告诉一个writable你已经写完毕,只需要调用.end()方法。你也可以使用.end(data)在结束前再写一些数据。
transform流
你可以将transform流想象成一个流的中间部分,它可以读也可以写,但是并不保存数据,它只负责处理流经它的数据。
duplex流
duplex流是一个可读也可写的流,就好像一个电话,可以接收也可以发送语音。