Node.js的Stream模块正是为解决这类场景而生

发布于2026-07-11 14:44 阅读12次 ## 为什么需要Stream
在Node.js日常开发中,处理大文件是绕不开的课题。假设你需要读取一个2GB的日志文件进行分析,如果用fs.readFileSync一次性加载到内存,服务器内存很可能直接爆炸。Node.js的Stream模块正是为解决这类场景而生。
## 四种核心流
### Readable可读流
从数据源读取数据,支持按块处理。常见的有fs.createReadStream和HTTP请求的req对象。
### Writable可写流
将数据写入目标。需要特别注意写入速度跟不上时的背压问题。
### Transform转换流
读取处理写入的中间环节,适合数据转换、文件压缩、内容加密场景。
### Duplex双工流
同时可读可写,典型的如TCP Socket通信。
## pipe管道的背压机制
pipe是Stream最优雅的用法,但容易被忽略的坑是背压。当writable.write返回false时说明缓冲区已满。此时应暂停读取等待drain事件。建议用pipeline替代pipe,自动处理背压和错误清理。
## 避坑要点
1. 不要在data回调里做同步耗时操作,会阻塞流的读取
2. 大文件用createReadStream而非readFileSync避免内存溢出
3. 错误处理必须加,不加error监听会导致进程崩溃退出
4. 背压不可忽视,write返回false就暂停等drain再继续
5. 忘记调用destroy或end会让流一直占用资源
6. 文本流注意指定编码,否则拿到的是Buffer而非字符串
## 实战日志拆分
使用readline逐行读取大日志文件按日期将日志行写入不同输出文件有效降低内存占用。掌握好这些知识后大文件处理不再是瓶颈。