如何逐行阅读并检测eof(文件结尾)?

时间:2016-04-20 16:15:45

标签: node.js io

逐行解决逐行读取文件的问题,如下所述:https://stackoverflow.com/a/16013228/570796

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语句检查它。

2 个答案:

答案 0 :(得分:4)

这是一个解决方案:

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!');
   // ...
});

答案 1 :(得分:0)

另一种(优雅的)方法可能是实施承诺。

您还可以添加拒绝("在阅读文件&#34时出错; ,链接到 input.on('错误')在阅读时但是问题不是100%所必需的。

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
}

有关承诺的更多信息,请查看以下介绍: