如何判断一个readStream是否没有更多的行可读?

我正在阅读一个大的文件(大于内存)一行一行地使用下面的代码:

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)。 但是我不想在每行处理之前写入对象。 行读取function中的所有代码都是同步的。

我怎么知道什么时候写文件是安全的?

这里有点棘手。 存储在r1的对象是readline.createInterface调用的结果:这意味着它是一个Interface ,而不是一个readStream 。 由于Interface是用来与一些代理进行交互的,因此,如文档中所写 ,您应该监听close事件:

事件:closures

close()被调用时被发射。

当inputstream收到end事件时也会发出。 Interface实例一旦发射就应该被视为“完成”。 例如,当inputstream接收^ D时,分别称为EOT。

所以它应该如下所示:

 rl.on('line', function(line) { // process emitted line }).on('close', function() { // all the lines read, go on }); 

你一直在使用readStream实例,你应该一直在听end事件。 当相应的stream(由fs.createReadStream创build)发出自己的end事件时,由readStream实例发出。 问题是Interface对象不会发出end事件,因为在这种情况下,通信结束意味着完全closures通道。