Node.js 自定义流

要创建我们自己的流,继承流类,并实现下表中列出的几个基本方法。

用例实施方法
只读Readable_read
只写Writable_write
读写Duplex_read, _write
操作被写入数据,然后读出结果Transform_transform, _flush

创建可读流

我们可以继承Readable类,在类中实现_read成员。

当有人请求读取数据时,流API调用该方法。

要传递数据,调用继承的成员函数 push 传入数据。

如果调用push(null),这表示读取流的结束。

以下代码显示如何创建可读流并返回1-10。

如果你运行这个,你会看到所有这些数字被打印。

  1. var Readable = require("stream").Readable;
  2. var util = require("util");
  3. function Counter() {
  4. Readable.call(this);
  5. this._max = 10;
  6. this._index = 1;
  7. }
  8. util.inherits(Counter, Readable);
  9. Counter.prototype._read = function () {
  10. var i = this._index++;
  11. if (i > this._max)
  12. this.push(null);
  13. else {
  14. var str = " " + i;
  15. this.push(str);
  16. }
  17. };
  18. // Usage, same as any other readable stream
  19. var counter = new Counter();
  20. counter.pipe(process.stdout);

创建可写流

从Writable类继承并实现_write方法。

_write方法在需要处理作为其第一个参数的块中传递。

以下代码创建一个简单的可写流,将所有传入的数据记录到控制台。

  1. var Writable = require("stream").Writable;
  2. var util = require("util");
  3. function Logger() {
  4. Writable.call(this);
  5. }
  6. util.inherits(Logger, Writable);
  7. Logger.prototype._write = function (chunk) {
  8. console.log(chunk.toString());
  9. };
  10. // Usage, same as any other Writable stream
  11. var logger = new Logger();
  12. var readStream = require("fs").createReadStream("log.txt");
  13. readStream.pipe(logger);