📅  最后修改于: 2023-12-03 15:38:05.278000             🧑  作者: Mango
在 Node.js 中,我们可以使用 fs 模块来读取文件内容。但是,如果文件内容很大,一次性读取会导致内存占用过高,进而影响程序的稳定性。所以我们需要逐行读取文件。
Node.js 提供了一个 readline 模块,它可以实现逐行读取,非常方便。以下是一个例子:
const fs = require('fs');
const readline = require('readline');
const rl = readline.createInterface({
input: fs.createReadStream('file.txt'),
crlfDelay: Infinity
});
rl.on('line', (line) => {
console.log(`Line from file: ${line}`);
});
在这个例子里,我们首先引入了 fs 和 readline 模块,然后创建了一个 readline.Interface 对象。其中,input 选项用于读取文件,crlfDelay 选项用于防止出现换行符问题(详见 readline 官方文档)。
最后,我们监听了 line 事件,每当读取到一行内容时,就触发回调函数并输出该行内容。
如果我们不想使用 readline 模块,也可以通过 fs 模块来逐行读取文件。以下是一个例子:
const fs = require('fs');
const readStream = fs.createReadStream('file.txt');
readStream.setEncoding('utf-8');
let data = '';
readStream.on('data', (chunk) => {
data += chunk;
data = data.replace(/[\r\n]*$/, ''); // 删除多余的换行符
const lines = data.split('\n');
while (lines.length > 1) {
console.log(lines.shift());
}
data = lines[0]; // 重新赋值为未完整读取的行内容
});
readStream.on('end', () => {
console.log(data); // 输出剩余的一行内容(如果有的话)
});
在这个例子里,我们首先创建了一个可读流,设置编码为 utf-8。接着,我们用一个变量 data 来缓存读取到的内容。每当读取到一块数据时,我们将其追加到 data 变量中,并删除其中多余的换行符。然后,我们将 data 按照换行符分割为若干行,并输出其中完整的行内容。
最后,如果仍有未完整读取的行内容,我们再次赋值给 data 变量,并等待下一次 data 事件的触发。
以上就是使用 Node.js 逐行读取文件的两种方法。如果文件内容较小,我们可以使用 fs.readFileSync() 方法一次性读取并处理。但如果文件内容较大,我们就需要使用逐行读取的方法,以免程序崩溃。