【发布时间】:2013-08-22 12:44:13
【问题描述】:
Stream docs 声明 Duplex Streams“是实现 Readable 和 Writable 接口的流”和 Transform Streams“是双工流,其中输出以某种方式从输入计算。”不幸的是,文档没有描述 Transform 流在 Duplex 流之外提供什么。
这两者有什么不同吗?您什么时候会使用其中一个?
【问题讨论】:
Stream docs 声明 Duplex Streams“是实现 Readable 和 Writable 接口的流”和 Transform Streams“是双工流,其中输出以某种方式从输入计算。”不幸的是,文档没有描述 Transform 流在 Duplex 流之外提供什么。
这两者有什么不同吗?您什么时候会使用其中一个?
【问题讨论】:
双工 - 可读可写的流(例如 net.Socket)。
Transform - 可以在写入和读取数据时修改或转换数据的双工流(例如,zlib.createDeflate())。
简单来说:
【讨论】:
区别只是语法糖。转换流是全双工流,但不是实现_write 和_read 方法,而是要求您只实现_transform 方法。您可以在优秀的substack's streams guide 或Isaacs's readable-stream repo 上阅读有关流的更多信息。
【讨论】:
双工流可以被认为是一个可读流和一个可写流。两者都是独立的,并且每个都有单独的内部缓冲区。读取和写入事件独立发生。
Duplex Stream ------------------| Read <----- External Source You ------------------| Write -----> External Sink ------------------| You don't get what you write. It is sent to another source.
Transform 流是一种双工,其中读取和写入以因果方式发生。双工流的端点通过某种变换链接。读需要写。
Transform Stream --------------|-------------- You Write ----> ----> Read You --------------|-------------- You write something, it is transformed, then you read something.
【讨论】:
_transform 方法,该方法与可写流的_write 方法具有相同的签名,因此这意味着读取的内容取决于写入的内容。这意味着您不能像_read 那样指定一次读取的字节数,它只是您写入的字节数。另一方面,对于双工流,理论上您可以创建一个依赖于_write 的_read,或者甚至拥有一个依赖于_read 的_write,但不能读/写Duplex Stream 类本身隐含了链接。
如果您阅读文档的 API for stream implementors 部分,他们会指出 Duplex 和 Transform 流的一些可能用例分别是“读取和写入”和“对写入的数据进行操作,然后读取结果”。
简单地说,Transform 流可以让您实现_transform 方法,该方法接受一些输入并在对数据进行一些操作后返回输出,并可用于压缩或散列等操作,而 Duplex 流可以用于诸如 TCP 套接字连接之类的东西,您只需在其中发送和接收数据。
【讨论】: