可读流运作于两种模式之一:流动模式(flowing)或暂停模式(paused)。 这些模式与[对象模式][object-mode]分开。 无论是否处于流动模式或暂停模式,[可读流]都可以处于对象模式。
- 在流动模式中,数据自动从底层系统读取,并通过 [
EventEmitter
] 接口的事件尽可能快地被提供给应用程序。 - 在暂停模式中,必须显式调用 [
stream.read()
][stream-read] 读取数据块。
所有[可读流]都开始于暂停模式,可以通过以下方式切换到流动模式:
- 添加 [
'data'
] 事件句柄。 - 调用 [
stream.resume()
][stream-resume] 方法。 - 调用 [
stream.pipe()
] 方法将数据发送到[可写流]。
可读流可以通过以下方式切换回暂停模式:
- 如果没有管道目标,则调用 [
stream.pause()
][stream-pause]。 - 如果有管道目标,则移除所有管道目标。调用 [
stream.unpipe()
] 可以移除多个管道目标。
只有提供了消费或忽略数据的机制后,可读流才会产生数据。 如果消费的机制被禁用或移除,则可读流会停止产生数据。
为了向后兼容,移除 ['data'
] 事件句柄不会自动地暂停流。
如果有管道目标,一旦目标变为 drain
状态并请求接收数据时,则调用 [stream.pause()
][stream-pause] 也不能保证流会保持暂停模式。
如果可读流切换到流动模式,且没有可用的消费者来处理数据,则数据将会丢失。
例如,当调用 readable.resume()
时,没有监听 'data'
事件或 'data'
事件句柄已移除。
添加 ['readable'
] 事件句柄会使流自动停止流动,并通过 [readable.read()
][stream-read] 消费数据。
如果 ['readable'
] 事件句柄被移除,且存在 ['data'
] 事件句柄,则流会再次开始流动。