可读流运作于两种模式之一:流动模式(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'] 事件句柄,则流会再次开始流动。