面试题答案
一键面试可读流(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('所有数据已写入完毕');
});