影子的知识库

影子的知识库

  • 知识库
  • GitHub

›stream系列

JVM系列

  • JVM内存区域
  • 对象创建-布局-访问
  • 内存溢出实战
  • 内存区域回收
  • 四大引用
  • 垃圾回收算法
  • HotSpot回收算法细节

Java系列

  • java注解
  • springboot请求参数绑定
  • springboot请求参数校验框架
  • YAML语法
  • 动态代理
  • classpath和java命令
  • springboot-aop编程
  • springboot统一异常处理
  • springboot数据库和事务
  • springboot拦截器
  • springboot中的web配置
  • docker的简单开发
  • springboot自动配置
  • 数据库的隔离级别
  • springboot监控
  • java类加载
  • java-agent的相关内容
  • 类加载器详解
  • java的SecurityManager
  • maven学习

Node

    JS 基础

    • 语法基础和数据类型
    • 数据类型转换
    • 语句 表达式 运算符
    • 变量与对象
    • 函数
    • 数据处理
    • 常用 API
    • 重点知识

    ES6

    • 块级作用域
    • 字符串和正则表达式
    • 函数
    • 对象
    • Symbol
    • Set和Map
    • 迭代器和生成器
    • 类
    • 数组
    • Promise

    Node 基础

    • 模块系统
    • package.json
    • 内置对象
    • npm脚本的使用
    • Buffer
    • Stream
    • 事件循环机制
    • 示例代码

    stream系列

    • 流的缓冲
    • 可读流
    • 可写流
    • 双工流和转换流
    • 自定义流

后期计划

  • 学习计划
  • 专题研究计划
Edit

本文内容

本文记录双工流和转换流的相关内容

什么是双工流

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 可读和/或可写流。
  • options
    • error 如果设置为 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() 会将悬挂的事件监听器留在流上。 在失败后重新使用流的情况下,这可能导致事件监听器泄漏和误吞的错误。

Last updated on 11/8/2020
← 可写流自定义流 →
  • 什么是双工流
  • 什么是转换流
  • transform.destroy([error])
  • stream.finished(stream[, options], callback)
  • stream.pipeline(...streams, callback)
影子的知识库
Docs
Getting Started (or other categories)Guides (or other categories)API Reference (or other categories)
Community
User ShowcaseStack OverflowProject ChatTwitter
More
BlogGitHub
Copyright © 2020 Cen ZhiPeng