可读流是生产数据用来供程序消费的流。举例:
const rs = fs.createReadStream(filePath); process.stdin.pipe(process.stdout);
写一个每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() 方法有三个参数
和自定义可读流类似,简单的自定义可写流只需要两步
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;
基本抄自:可读流
可读流是生产数据用来供程序消费的流。举例:
const rs = fs.createReadStream(filePath); process.stdin.pipe(process.stdout);
写一个每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() 方法有三个参数
和自定义可读流类似,简单的自定义可写流只需要两步
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;
基本抄自:可读流