如何逐行读取并检测文件末尾(EOF)?

3

关于逐行读取文件的解决方案,可以参考这里:https://dev59.com/3WQo5IYBdhLWcg3wfPbK#16013228


var fs       = require('fs'),
    readline = require('readline'),
    instream = fs.createReadStream('/path/to/file');

var rl = readline.createInterface(
{
    input: instream,
    terminal: false
});

rl.on('line', function(line) 
{
    console.log(line);
    // if(instream.isEnd()) ...
});

如何检测文件是否已读取到末尾?

我知道可以在ReadStream上使用事件on('end', () => {/*...*/})来检测,但我需要一个可以通过if语句进行检查的解决方案。

3个回答

5
这里有一个解决方案:
let ended = false;
instream.on('end', () => { ended = true });

rl.on('line', function(line) {
    if (ended) {
        //...

然而,有很大的可能性你实际上并不需要这个,你的应用程序可以被构建得不同。

我不确定 line 事件是否会在 end 事件之后发生。


结果证明我的怀疑是正确的,所以你需要按照这种方式进行。

let lastLine;
rl.on('line', line => { lastLine = line })

instream.on('end', () => {
   assert.notStrictEqual(lastLine, undefined, 'There were no lines!');
   // ...
});

是的,两个异步事件并排这样做对我来说不可行 :) - superhero
我已经回答了你提出的问题。如果你认为它行不通,那很可能是因为你从未询问过你实际想要做什么。 - OrangeDog
哦,我是根据你在问题中最初报告的内容来回答的。祝你好运。 - OrangeDog
再次尝试,就是在事件被触发的意义上起作用了,但它在line事件之后被触发。因此,我不能在该处理程序中使用它来判断是否为最后一行。 - superhero
我一直认为可能是这种情况,因此建议您需要重新构建处理过程。如何继续取决于您在到达最后一步之后要做什么。 - OrangeDog
显示剩余9条评论

5

您还可以使用close事件。

const fs = require("fs");
const readline = require('readline');

const readInterface = readline.createInterface({
    input: fs.createReadStream("path/to/file.txt"),
    output: process.stdout,
    terminal: false,
})
rl.on("line", function(line){
    console.log(line);
}).on("close", function() {
    console.log("EOF");
})
close 事件将在文件没有更多数据可读取时运行。

1
另一种(优雅的)方法是实现 Promise。在读取时,可以进一步添加 reject("Error while reading File"),并与 input.on('error') 相关联。但这对于解决问题并非必需。
var fs = require('fs');
var input = require('fs').createReadStream('./inputFile.txt')

var promise = new Promise(function(resolve, reject) {
  var lineReader = require('readline').createInterface({
    input: input
  });
  input.on('end', () => {
    resolve("I reached the end!");
  });

  lineReader.on('line', (line) => {
    // DO STH. WITH EACH LINE (IF DESIRED)
  });
});

promise.then((resolveResult) => {
  // DO WHATEVER YOU WANT TO DO AFTER
}

如果想了解有关Promise的更多信息,可以参考以下介绍:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接