请阐述 Node.js 中流(Stream)的概念,并给出一个具体的代码示例,演示如何利用流来处理数据。
考察说明
考查对 Node.js 流机制的理解及实际应用能力。
回答思路
- 【回答框架 1】流是 Node.js 处理数据的抽象接口,将数据分成小块按顺序处理,避免一次性加载大量数据到内存,适用于文件读写、网络请求等场景。
- 【回答框架 2】Node.js 中有四种类型的流:可读流(Readable)、可写流(Writable)、双工流(Duplex)和转换流(Transform)。可读流用于读取数据,可写流用于写入数据,双工流既可读又可写,转换流在读写过程中可修改数据。
- 【回答框架 3】示例:使用可读流读取文件,并通过管道(pipe)方法将数据写入可写流,实现文件复制。代码:const fs = require('fs'); const readStream = fs.createReadStream('input.txt'); const writeStream = fs.createWriteStream('output.txt'); readStream.pipe(writeStream); 这样数据以小块形式流动,内存占用低。
- 【回答框架 4】流基于事件机制,可读流有 data、end 等事件,可写流有 finish 事件。通过监听事件可自定义处理逻辑,如处理数据块、处理错误。
- 【回答框架 5】流的背压机制很重要:当写入速度慢于读取时,pipe 方法会自动暂停读取,防止内存溢出。若手动处理,需关注 write 方法的返回值并适当暂停/恢复。
- 【关键点 1】流通过分块处理数据,降低内存占用。
- 【关键点 2】四种流类型:Readable、Writable、Duplex、Transform。
- 【关键点 3】pipe 方法简化数据流动并自动管理背压。
- 【关键点 4】流基于事件驱动,如 data、end、finish。
- 【关键点 5】背压处理是流正确使用的关键。
- 【易错点 1】使用流时,若未正确处理错误事件,可能导致进程崩溃。
- 【易错点 2】手动处理流动模式时,忽略背压可能造成内存消耗过大。
- 【易错点 3】流的事件监听可能导致内存泄漏,需及时移除监听器。