示例:逐行读取文件流
¥Example: Read file stream line-by-Line
node:readline 的一个常见用例是每次一行地消费输入文件。最简单的方式是利用 fs.ReadStream API 和 for await...of 循环:
¥A common use case for node:readline is to consume an input file one line at a
time. The easiest way to do so is leveraging the fs.ReadStream API as
well as a for await...of loop:
const fs = require('node:fs');
const readline = require('node:readline');
async function processLineByLine() {
  const fileStream = fs.createReadStream('input.txt');
  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  });
  // Note: we use the crlfDelay option to recognize all instances of CR LF
  // ('\r\n') in input.txt as a single line break.
  for await (const line of rl) {
    // Each line in input.txt will be successively available here as `line`.
    console.log(`Line from file: ${line}`);
  }
}
processLineByLine(); 或者,可以使用 'line' 事件:
¥Alternatively, one could use the 'line' event:
const fs = require('node:fs');
const readline = require('node:readline');
const rl = readline.createInterface({
  input: fs.createReadStream('sample.txt'),
  crlfDelay: Infinity
});
rl.on('line', (line) => {
  console.log(`Line from file: ${line}`);
}); 目前,for await...of 循环可能会慢一点。如果 async / await 流量和速度都必不可少,则可以应用混合方法:
¥Currently, for await...of loop can be a bit slower. If async / await
flow and speed are both essential, a mixed approach can be applied:
const { once } = require('node:events');
const { createReadStream } = require('node:fs');
const { createInterface } = require('node:readline');
(async function processLineByLine() {
  try {
    const rl = createInterface({
      input: createReadStream('big-file.txt'),
      crlfDelay: Infinity
    });
    rl.on('line', (line) => {
      // Process the line.
    });
    await once(rl, 'close');
    console.log('File processed.');
  } catch (err) {
    console.error(err);
  }
})();