MST
星途 面试题库

面试题:Node.js 中可读流与可写流的工作原理及简单应用

请阐述 Node.js 中可读流(Readable Stream)和可写流(Writable Stream)的工作原理,并分别举例说明它们在文件读写场景中的简单应用。
47.1万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

可读流(Readable Stream)工作原理

可读流用于从源(如文件、网络连接等)读取数据。它有两种模式:暂停模式和流动模式。

  • 暂停模式:在暂停模式下,数据不会自动流动,需要手动调用 read() 方法来从内部缓冲区读取数据。只有当缓冲区有数据时,read() 才会返回数据,否则返回 null
  • 流动模式:在流动模式下,数据会自动从底层系统流向 Node.js 应用程序。可读流会自动触发 data 事件,将数据块传递给事件监听器。可以通过监听 data 事件来处理接收到的数据块,当没有更多数据可读时,会触发 end 事件。

可读流在文件读写场景的简单应用示例

const fs = require('fs');
const readableStream = fs.createReadStream('example.txt');

readableStream.on('data', (chunk) => {
    console.log('接收到数据块:', chunk.length, '字节');
    console.log('数据块内容:', chunk.toString());
});

readableStream.on('end', () => {
    console.log('所有数据已读取完毕');
});

可写流(Writable Stream)工作原理

可写流用于将数据写入目标(如文件、网络连接等)。应用程序调用 write() 方法将数据写入流,可写流会将数据暂存到内部缓冲区,当缓冲区达到一定阈值(highWaterMark)时,write() 方法会返回 false,表示缓冲区已满,此时应用程序应暂停写入,直到 drain 事件触发,表明缓冲区有空间可以继续写入数据。当所有数据都写入完成后,调用 end() 方法关闭流。

可写流在文件读写场景的简单应用示例

const fs = require('fs');
const writableStream = fs.createWriteStream('output.txt');

const data = '这是要写入文件的数据';
const writeResult = writableStream.write(data);
if (!writeResult) {
    console.log('缓冲区已满,暂停写入');
}

writableStream.on('drain', () => {
    console.log('缓冲区有空间,可以继续写入');
});

writableStream.end();
writableStream.on('finish', () => {
    console.log('所有数据已写入完毕');
});