首页 > 代码库 > 流模块基础

流模块基础

简介

在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\n‘);

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流是一个可读也可写的流,就好像一个电话,可以接收也可以发送语音。

流模块基础