如何判断readStream是否没有更多行要读取?

时间:2014-12-10 13:06:05

标签: javascript node.js

我正在使用以下代码逐行读取一个大文件(大于内存):

var fs = require('fs');
var readline = require('readline');
var stream = require ('stream');

function begin(){

    var instream = fs.createReadStream(fileLocation);
    var outstream = new stream;
    outstream.readable = true;
    outstream.writable = true;

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

    var ctr = 0;
    rl.on('line', function(line) { //line reading function
       //work done here.
    });
}

我做了一些处理,然后需要将文件写入磁盘(JSON)。但是我不想在处理每一行之前编写对象。行读取功能中的所有代码都是同步的。

如何知道何时编写文件是安全的?

1 个答案:

答案 0 :(得分:2)

这里有点棘手。存储在r1中的对象是readline.createInterface调用的结果:这意味着它是Interface,而不是readStream。由于Interface用于与某些代理进行互动,因此您written in the docs应该监听close事件:

  

事件:关闭

     

调用close()时发出。

     

当输入流收到其end事件时也会发出。该   {I} {}}实例应该被视为“完成”   发射。例如,当输入流分别接收^ D时   被称为EOT。

所以它应该如下所示:

Interface

您是否一直在使用rl.on('line', function(line) { // process emitted line }).on('close', function() { // all the lines read, go on }); 实例,您应该一直在监听readStream事件。当相应的流(由end创建)发出自己的readStream事件时,它由fs.createReadStream实例发出。问题是end对象不会发出Interface事件 - 因为在这种情况下通信结束意味着完全关闭通道。