本文内容
本文记录双工流和转换流的相关内容
什么是双工流
stream.Duplex 是一个双工流。
双工流就是同时实现了 Readable 和 Writable 的流,即可以作为上游生产数据,又可以作为下游消费数据,这样可以处于数据流动管道的中间部分,即
rs.pipe(rws1).pipe(rws2).pipe(rws3).pipe(ws);
就类似于一些 UNIX 的命令的设计那样,读取标准输入,然后写入到标准输出,就可以看做是一个双工流。可以从上游进行读取,然后输出的数据又可以被下游读取。上述的命令在 bash 中就类似于
$ cmd1 | cmd2 | cmd3 | cmd4
什么是转换流
stream.Transform 是一个转换流。
转换流也同时是一种双工流,但它的输出与输入是相关联的。 与 Duplex 流一样, Transform 流也同时实现了 Readable 和 Writable 接口
transform.destroy([error])
销毁流,并可选地触发 'error' 事件。 调用该方法后,transform 流会释放全部内部资源。 实现者不应该重写此方法,而应该实现 readable._destroy()。 Transform 流的 _destroy() 方法的默认实现会触发 'close' 事件,除非 emitClose 被设置为 false。
stream.finished(stream[, options], callback)
stream可读和/或可写流。optionserror如果设置为false,则对emit('error', err)的调用不会被视为已完成。 默认值:true。readable当设置为false时,即使流可能仍然可读,当流结束时也将会调用回调。默认值:true。writable当设置为false时,即使流可能仍然可写,当流结束时也将会调用回调。默认值:true。
callback带有可选错误参数的回调函数。- 返回: 清理函数,它会移除所有已注册的监听器。
当流不再可读、可写、或遇到错误、或过早关闭事件时,则该函数会获得通知。
const { finished } = require('stream');
const rs = fs.createReadStream('archive.tar');
finished(rs, (err) => {
if (err) {
console.error('流读取失败', err);
} else {
console.log('流已完成读取');
}
});
rs.resume(); // 排空流。
stream.pipeline(...streams, callback)
...streams要使用管道传送的两个或多个流。callback当管道完全地完成时调用。err错误
一个模块方法,使用管道传送多个流,并转发错误和正确地清理,当管道完成时提供回调。
const { pipeline } = require('stream');
const fs = require('fs');
const zlib = require('zlib');
// 使用 pipeline API 轻松地将一系列的流通过管道一起传送,并在管道完全地完成时获得通知。
// 使用 pipeline 可以有效地压缩一个可能很大的 tar 文件:
pipeline(
fs.createReadStream('archive.tar'),
zlib.createGzip(),
fs.createWriteStream('archive.tar.gz'),
(err) => {
if (err) {
console.error('管道传送失败', err);
} else {
console.log('管道传送成功');
}
}
);
这个方法就是说,把传入的这些流排成管道,例如
pipeline(stream1,stream2,stream3,callback)
类似于
stream1.pipe(stream2).pipe(stream3)
stream3.on('finish',callback)
stream.pipeline() 将会在所有的流上调用 stream.destroy(err),除了:
- 已触发
'end'或'close'的Readable流。 - 已触发
'finish'或'close'的Writable流。
在调用 callback 之后, stream.pipeline() 会将悬挂的事件监听器留在流上。 在失败后重新使用流的情况下,这可能导致事件监听器泄漏和误吞的错误。