思路
- 流的使用:使用可读流(
fs.createReadStream
)从大文本读取数据,使用可写流(fs.createWriteStream
)写入文件。这样数据会以小块的形式流动,而不是一次性全部读入内存。
- 背压处理:在数据流动过程中,处理背压问题。可写流可能会因为写入速度慢于可读流读取速度而导致数据堆积,通过监听可写流的
drain
事件来处理这种情况。
关键代码片段
const fs = require('fs');
const readableStream = fs.createReadStream('largeTextFile.txt');
const writableStream = fs.createWriteStream('outputFile.txt');
// 监听可读流的data事件,将数据写入可写流
readableStream.on('data', (chunk) => {
const writeResult = writableStream.write(chunk);
if (!writeResult) {
// 如果write返回false,说明可写流缓冲区已满,暂停可读流
readableStream.pause();
writableStream.once('drain', () => {
// 当可写流缓冲区有空间时,恢复可读流
readableStream.resume();
});
}
});
// 处理可读流结束事件
readableStream.on('end', () => {
writableStream.end();
});
// 处理错误
readableStream.on('error', (err) => {
console.error('Read error:', err);
});
writableStream.on('error', (err) => {
console.error('Write error:', err);
});