【问题标题】:How to read line by line and detect eof (end of file)?如何逐行读取并检测 eof(文件结尾)?
【发布时间】:2016-08-13 11:22:43
【问题描述】:

跟进逐行读取文件的解决方案,如下所述: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 语句检查它的解决方案。

【问题讨论】:

    标签: node.js io


    【解决方案1】:

    这里有一个解决方案:

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

    【讨论】:

    • 是的,像这样并排的两个异步事件不适合我 :)
    • 所有Javascript都在一个线程中执行; Node.js 提供事件队列。当我说我不确定它是否会发生时,我的意思是无论您如何实施检查,它始终是错误的,因此没有理由拥有它。
    • ...也许我的例子与上下文不同,请赐教:)
    • 你真的是想问我如何获取文件的最后一行?
    • 什么?不,我问的是如何知道我正在阅读最后一行。
    【解决方案2】:

    另一种(优雅的)方法可能是实现 Promise。

    您还可以添加一个 reject("Error while reading File"),在阅读时链接到 input.on('error')。但这并不是您的问题 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
    }
    

    有关 Promise 的更多信息,我会查看以下介绍:

    【讨论】:

      【解决方案3】:

      您也可以使用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 事件将在文件没有更多数据可供读取时运行。

      【讨论】:

        猜你喜欢
        • 2019-07-24
        • 2017-02-04
        • 1970-01-01
        • 2013-07-14
        • 2019-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        相关资源
        最近更新 更多