📜  如何使用 node.js 逐行读取文件?(1)

📅  最后修改于: 2023-12-03 15:38:05.278000             🧑  作者: Mango

如何使用 Node.js 逐行读取文件?

在 Node.js 中,我们可以使用 fs 模块来读取文件内容。但是,如果文件内容很大,一次性读取会导致内存占用过高,进而影响程序的稳定性。所以我们需要逐行读取文件。

1. 使用 readline 模块

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 事件,每当读取到一行内容时,就触发回调函数并输出该行内容。

2. 使用 fs 模块

如果我们不想使用 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() 方法一次性读取并处理。但如果文件内容较大,我们就需要使用逐行读取的方法,以免程序崩溃。