1、场景
我想读取一个 txt 。取到某一行特定字符的时候,终止读取。代码如下:
// 引入模块
const readline = require('readline');
const fs = require('fs');
const stream = fs.createReadStream('./txt/测试文本.txt');
const rl = readline.createInterface({
input: stream,
});
// 定义变量
let singer_msg_list = [];
// 开始读取
rl.on('line', (line) => {
`aaaaaaaaaaaaaa`
if(line.indexOf('<name>') !== -1){
// 添加这一行。
singer_msg_list.push(line);
}else{
// 程序结束
rl.close()
}
})
.on('close', () => {
console.log("读取到的值:" + singer_msg_list);
});
运行之后。文本正确输出,rl.close()
触发,程序结束。
但我发现,如果在 aaaaaaaaa
处添加
console.log("这一行是:"+line);
那么。程序调用之后,Node会继续读取下面的文本行!close()
触发了,但程序没有结束。
(会读到最后一行才结束)
2、参考文档
http://nodejs.cn/api/readline...
Node 文档中提到:
rl.close() 方法会关闭 readline.Interface 实例,并放弃对 input 和 output 流的控制。
当调用时,将触发 'close' 事件。
调用 rl.close() 不会立即停止 readline.Interface 实例触发的其他事件(包括 'line')。
这几句我没看懂。
为什么加上 console.log()
就会导致 line事件 继续触发呢?
我尝试结束 createReadStream
的流、调用fs.close(),均不能关闭。
stream.destroy()
stream.close();
stream.push(null)
stream.read(0);
fs.close(rl, (err) => {
if (err) throw err;
});
(参考了:http://nodejs.cn/api/fs.html#...
https://stackoverflow.com/que...)
望解疑。
你自己都看到了文档说的很清楚
不会立即停止line事件,表示调用rl.close后line事件还会继续出发的,和你加不加上 console.log()没有关系的,不行你在rl.close之前打个日志就知道了