示例:逐行读取文件流
readline 的一个常见用例是每次一行地消费输入文件。
最简单的方式是利用 fs.ReadStream API 和 for await...of 循环:
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,
});
// 注意:使用 crlfDelay 选项
// 将 input.txt 中的所有 CR LF ('\r\n') 实例识别为单个换行符。
for await (const line of rl) {
// input.txt 中的每一行都将在此处作为 `line` 连续可用。
console.log(`Line from file: ${line}`);
}
}
processLineByLine();或者,可以使用 'line' 事件:
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 流量和速度都必不可少,则可以应用混合方法:
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) => {
// 处理行。
});
await once(rl, 'close');
console.log('File processed.');
} catch (err) {
console.error(err);
}
})();A common use case for 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();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}`);
});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);
}
})();