可读流

可读流是生产数据用来供程序消费的流。举例:

const rs = fs.createReadStream(filePath); process.stdin.pipe(process.stdout);

自定义可读流

  1. 继承 sream 模块的 Readable
  2. 重写 _read 方法,调用 this.push 将生产的数据放入待读取队列

写一个每100毫秒产生随机数的流

const Readable = require('stream').Readable; class RandomNumberStream extends Readable { constructor(max) { super() } _read() { const ctx = this; setTimeout(() => { const randomNumber = parseInt(Math.random() * 10000); // 只能 push 字符串或 Buffer,为了方便显示打一个回车 ctx.push(`${randomNumber}\n`); }, 100); }

如果需要停下来的话,用ctx.push(null) 就行了。

可写流

可写流是对数据流向设备的抽象,用来消费上游流过来的数据,通过可写流程序可以把数据写入设备,常见的是本地磁盘文件或者 TCP、HTTP 等网络响应。

const fs = require('fs'); const rs = fs.createReadStream('./w.js'); const ws = fs.createWriteStream('./copy.js'); rs.setEncoding('utf-8'); rs.on('data', chunk => { ws.write(chunk); });

write() 方法有三个参数

  • chunk {String| Buffer},表示要写入的数据
  • encoding 当写入的数据是字符串的时候可以设置编码
  • callback 数据被写入之后的回调函数

自定义可写流

和自定义可读流类似,简单的自定义可写流只需要两步

  1. 继承 stream 模块的 Writable 类
  2. 实现 _write() 方法

const Writable = require('stream').Writable class OutputStream extends Writable { _write(chunk, enc, done) { // 转大写之后写入标准输出设备 process.stdout.write(chunk.toString().toUpperCase()); // 此处不严谨,应该是监听写完之后才调用 done process.nextTick(done); } } module.exports = OutputStream;

参考

基本抄自:可读流