Node.js Stream 流:高效处理大数据
学习如何使用 Node.js Stream 以流式方式处理大文件,提升内存效率。 · 难度:入门 · +15XP
什么是 Stream?
Stream(流)是 Node.js 中处理流式数据的抽象接口。当你处理大文件(如视频、日志)时,传统的一次性读取会占用大量内存,而 Stream 允许你将数据分成小块(chunks)逐块处理,显著降低内存占用。
四种基本流类型
| 类型 | 说明 | 示例 |
|---|---|---|
| Readable | 可读流(数据源) | fs.createReadStream |
| Writable | 可写流(数据目标) | fs.createWriteStream |
| Transform | 转换流(读写兼可) | zlib.createGzip |
| Duplex | 双工流(独立读写) | net.Socket |
创建可读流
使用 fs.createReadStream 创建文件可读流,监听 data 事件获取数据块:
const fs = require('fs');
const readStream = fs.createReadStream('large-file.txt', { encoding: 'utf8' });
readStream.on('data', (chunk) => {
console.log('收到数据块,长度:', chunk.length);
});
readStream.on('end', () => console.log('读取完成'));管道(pipe)操作
pipe() 是 Stream 最强大的方法,自动管理数据流和背压(backpressure):
const fs = require('fs');
const readStream = fs.createReadStream('input.txt');
const writeStream = fs.createWriteStream('output.txt');
readStream.pipe(writeStream);
writeStream.on('finish', () => console.log('复制完成'));练习提示
尝试修改下方代码:将读取的流通过 transform 将文本转换为大写后写入文件。提示:使用 through2 或自定义 Transform 流。