Stream(流)是 Node.js 中处理流式数据的抽象接口,是 Node.js 的核心模块之一,用于高效处理大量数据或需要逐步处理的数据。
1. Stream 基本概念
1.1 什么是 Stream
Stream 是一种以高效方式处理读/写数据的方法,特别适用于处理大文件或连续的数据源。它们不是一次性将数据全部加载到内存中,而是分块逐步处理。
1.2 Stream 的四种类型
-
Readable Streams(可读流) - 数据来源(如
fs.createReadStream()
) -
Writable Streams(可写流) - 数据目标(如
fs.createWriteStream()
) -
Duplex Streams(双工流) - 既可读又可写(如
net.Socket
) -
Transform Streams(转换流) - 可修改或转换数据的双工流(如
zlib.createGzip()
)
1.3 Stream 的优势
-
内存效率:不需要一次性加载大量数据到内存
-
时间效率:可以立即开始处理数据,而不必等待所有数据都可用
-
组合性:可以通过管道(pipe)将多个操作连接起来
2. Readable Stream(可读流)
2.1 创建可读流
const { Readable } = require('stream');
// 方法1:实例化Readable类
const myReadable = new Readable({
read(size) {
// 自定义读取逻辑
}
});
// 方法2:使用内置方法(如文件读取)
const fs = require('fs');
const fileStream = fs.createReadStream('./file.txt');
2.2 读取数据的方式
2.2.1 'data' 事件
readableStream.on('data', (chunk) => {
console.log(`Received ${chunk.length} bytes of data.`);
});
2.2.2 'readable' 事件 + read() 方法
readableStream.on('readable', () => {
let chunk;
while ((chunk = readableStream.read()) !== null) {
console.log(`Received ${chunk.length} bytes of data.`);
}
});
2.2.3 异步迭代器(Node.js 10+)
for await (const chunk of readableStream) {
console.log(`Received ${chunk.length} bytes of data.`);
}
2.3 可读流的两种模式
-
流动模式(Flowing Mode):数据自动通过事件循环推送
-
暂停模式(Paused Mode)