readline 的一个常见用例是每次一行地输入文件。 最简单的方法是利用 [fs.ReadStream] API 以及 for await...of 循环:

    1. const fs = require('fs');
    2. const readline = require('readline');
    3. async function processLineByLine() {
    4. const fileStream = fs.createReadStream('input.txt');
    5. const rl = readline.createInterface({
    6. input: fileStream,
    7. crlfDelay: Infinity
    8. });
    9. // 注意:我们使用 crlfDelay 选项将 input.txt 中的所有 CR LF 实例('\r\n')识别为单个换行符。
    10. for await (const line of rl) {
    11. // input.txt 中的每一行在这里将会被连续地用作 `line`。
    12. console.log(`Line from file: ${line}`);
    13. }
    14. }
    15. processLineByLine();

    或者,可以使用 ['line'] 事件:

    1. const fs = require('fs');
    2. const readline = require('readline');
    3. const rl = readline.createInterface({
    4. input: fs.createReadStream('sample.txt'),
    5. crlfDelay: Infinity
    6. });
    7. rl.on('line', (line) => {
    8. console.log(`文件中的每一行: ${line}`);
    9. });

    目前,for await...of 循环可能会慢一点。 如果 async / await 流和速度都是必不可少的,可以应用混合方法:

    1. const { once } = require('events');
    2. const { createReadStream } = require('fs');
    3. const { createInterface } = require('readline');
    4. (async function processLineByLine() {
    5. try {
    6. const rl = createInterface({
    7. input: createReadStream('big-file.txt'),
    8. crlfDelay: Infinity
    9. });
    10. rl.on('line', (line) => {
    11. // 处理行。
    12. });
    13. await once(rl, 'close');
    14. console.log('文件已处理');
    15. } catch (err) {
    16. console.error(err);
    17. }
    18. })();