【发布时间】:2017-10-24 12:18:43
【问题描述】:
我有以下文件,我想逐行读取并在找到“nameserver 8.8.8.8”后停止读取。
nameserver 8.8.8.8
nameserver 45.65.85.3
nameserver 40.98.3.3
我正在使用 nodejs 和 readline 模块来这样做
const readline = require('readline');
const fs = require('fs');
function check_resolv_nameserver(){
// flag indicates whether namerserver_line was found or not
var nameserver_flag = false;
const rl = readline.createInterface({
input: fs.createReadStream('file_to_read.conf')
});
rl.on('line', (line) => {
console.log(`Line from file: ${line}`);
if (line === 'nameserver 8.8.8.8'){
console.log('Found the right file. Reading lines should stop here.');
nameserver_flag = true;
rl.close();
}
});
rl.on('close', function(){
if (nameserver_flag === true){
console.log('Found nameserver 8.8.8.8');
}
else {
console.log('Could not find nameserver 8.8.8.8');
}
});
}
check_resolv_nameserver();
由于我在阅读第一场比赛后立即使用 rl.close() 发出关闭事件,因此我希望我的代码仅读取第一行,然后停止进一步阅读。但是我的输出看起来像这样
Line from file: nameserver 8.8.8.8
Found the right file. Reading lines should stop here.
Found nameserver 8.8.8.8
Line from file: nameserver 45.65.85.3
Line from file: nameserver 40.98.3.3
如何让 readline 在第一次比赛后停止并让我继续做其他事情?
【问题讨论】:
-
我的猜测是文件内容被缓冲了,所以如果缓冲区中还有完整的行,关闭
rl(或文件句柄)不会阻止更多line事件被发出.一种解决方法是在获得正确的行后设置一个标志,如果设置了该标志,则忽略后续行。 -
@gvoigt : 你找到办法了吗
-
@robertklep,我认为您是对的...,因为数据大小实际上来自 createReadStream 的 highWaterMark...,只要有剩余的行,行事件就会一直触发。 ..
-
要关闭rl我们必须先关闭readStream,但是readStrean一次读取的数据太多,我们无法停止。
-
lineReader.close(); lineReader.removeAllListeners()