流是个抽象的概念,当程序需要从某个数据源读入数据的时候,就会开启一个数据流,数据源可以是文件、内存或网络等等。相反地,需要写出数据到某个数据源目的地的时候,也会开启一个数据流,这个数据源目的地也可以是文件、内存或网络等等。
例如:一个请求到HTTP服务器是一个流,是标准输出。
流是可读、可写、或可读写。
所有的数据流都是EventEmitter的实例。
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
可读流接口是一个你阅读来自数据源的抽象。换句话说,数据是从一个可读流读取的。
// 加载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);
同样的这样的写法不对,因为抽象。
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是基于事件的,因此一些操作需要使用事件来完成相关操作。这里只是简单的描述了两种流的使用,并没有操作文件等信息。