Node.js流(Stream)的基本操作

什么是流(Stream)

流是个抽象的概念,当程序需要从某个数据源读入数据的时候,就会开启一个数据流,数据源可以是文件、内存或网络等等。相反地,需要写出数据到某个数据源目的地的时候,也会开启一个数据流,这个数据源目的地也可以是文件、内存或网络等等。

Node.js流 Stream

例如:一个请求到HTTP服务器是一个流,是标准输出。
流是可读、可写、或可读写。
所有的数据流都是EventEmitter的实例。

如何使用流(Stream)

stream模块提供:

  • 可读流(Readable streams)
  • 可写流(Writable streams)
  • 双向流/可读写流(Duplex streams)
  • 变换流(Transform streams.)
使用方案 类(Class) 实现方法
Reading only Readable _read
Writing only Writable _write
Reading and writing Duplex _read, _write
Operate on written data, then read the result Transform _transform, _flush

注意:我们可以重写实现方法来自定义读取/写入数据。

var stream = require("stream")

参考文档

官方文档:http://nodejs.org/api/stream.html

使用读流(Readable)

可读流接口是一个你阅读来自数据源的抽象。换句话说,数据是从一个可读流读取的。

// 加载stream模块
var stream = require("stream");
// 因为Readable是一个抽象,因此不能直接创建对象
var reader = new stream.Readable();
// Error: not implemented

继承Readable实现读取流子类

var Readable = require("stream").Readable;
var util = require("util");

// 原型构造方法继承
util.inherits(ObjectStream, Readable);

function ObjectStream(opt) {
    Readable.call(this, opt);// 调用父类构造方法
}

// _read方法是read方法的底层实现
ObjectStream.prototype._read = function() {
    this.push("hello 雨林博客");
};

var con = new ObjectStream();
var info =  con.read();//读取流中的数据,这
console.log("流中的数据:%s",info);

使用写流(Writable)

同样的这样的写法不对,因为抽象。

var Writable = require("stream").Writable;

var w = new Writable();// 这里不会报错

w.write("hello body");
// Error: not implemented

创建实现,这点还有点点问题。

var Writable = require("stream").Writable;

var util = require("util");

util.inherits(ObjectWritable,Writable);

function ObjectWritable(opt){
    Writable.call(this,opt);
}
ObjectWritable.prototype._write = function(a){
    console.log(" data=%s 写入到哪里呢?",a);
}

var writer = new ObjectWritable();
writer.write("hello, world");

总结

Node.js中的流和Java中的流概念也差不多。但是Node.js是基于事件的,因此一些操作需要使用事件来完成相关操作。这里只是简单的描述了两种流的使用,并没有操作文件等信息。

来源: 雨林博客(www.yl-blog.com)