Node.js Stream 流:高效处理大数据
学习如何使用 Node.js 的 Stream 接口以流式方式处理大文件与数据管道。 · 难度:入门 · +15XP
什么是 Stream?
Stream(流)是 Node.js 中处理 I/O 数据的一种抽象接口。与一次性加载整个文件到内存不同,Stream 允许你将数据分成小块(chunk)逐步处理,极大提升内存效率与性能。
四种基本流类型
| 类型 | 说明 |
|---|---|
| Readable | 可读流(如 fs.createReadStream) |
| Writable | 可写流(如 fs.createWriteStream) |
| Transform | 转换流(读写同时可修改数据,如 zlib.createGzip) |
| Duplex | 双工流(既可读又可写,如 net.Socket) |
读取文件流示例
const fs = require('fs');
const readStream = fs.createReadStream('input.txt', { encoding: 'utf8' });
readStream.on('data', (chunk) => {
console.log('接收到一块数据,长度:', chunk.length);
});
readStream.on('end', () => {
console.log('读取完成');
});
readStream.on('error', (err) => {
console.error('发生错误:', err);
});
管道操作
使用 pipe() 方法可以将一个可读流直接导向一个可写流,实现自动背压(backpressure)控制。
const fs = require('fs');
const readStream = fs.createReadStream('source.txt');
const writeStream = fs.createWriteStream('destination.txt');
readStream.pipe(writeStream);
writeStream.on('finish', () => {
console.log('文件复制完成');
});
练习提示
尝试修改右侧代码,使用 fs.createReadStream 读取一个较大文件(如 100MB),观察内存占用。对比 fs.readFile 一次性读取时的内存差异。可以将 chunk 累加并打印总长度。