Node.js流(Stream)的基本操作
什么是流(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是基于事件的,因此一些操作需要使用事件来完成相关操作。这里只是简单的描述了两种流的使用,并没有操作文件等信息。