如何判断一个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通道。