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

sup*_*ero 3 io node.js

逐行读取文件的解决方案的后续操作,如下所述: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()) ...
});
Run Code Online (Sandbox Code Playgroud)

如何检测我是否到达文件末尾?

我知道有一个事件,ReadStream on('end', () => {/*...*/})但我需要一个解决方案,我可以通过 if 语句检查它。

Sto*_*ica 5

这是一个解决方案:

let ended = false;
instream.on('end', () => { ended = true });

rl.on('line', function(line) {
    if (ended) {
        //...
Run Code Online (Sandbox Code Playgroud)

但是,您很有可能实际上并不需要它,并且您的应用程序的结构可能有所不同。

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


事实证明我的怀疑是真的,所以你需要这样做。

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

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


小智 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");
})
Run Code Online (Sandbox Code Playgroud)

close当文件没有更多数据可供读取时,该事件将运行。