我正在使用以下代码逐行读取一个大文件(大于内存):
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)。但是我不想在处理每一行之前编写对象。行读取功能中的所有代码都是同步的。
如何知道何时编写文件是安全的?
答案 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
事件 - 因为在这种情况下通信结束意味着完全关闭通道。