我正在使用 ReadLine 逐行读取一个非常大的文件,以便能够检测到可以将其分割成有意义的部分并分成几个其他文件的位置。我使用 WriteStream 写入这些文件。当正则表达式检测到剪切位置时,我 end() 当前打开的 WriteStream 并为刚刚读取的行打开一个新的 WriteStream。问题是所有这些文件最终都会被截断,就好像 end() 调用没有完成其工作一样。
我检查了 write() 是否成功,并在缓冲区已满时暂停输入流。这是我的代码的相关部分:
var rl = readline.createInterface({
input: fs.createReadStream('basesystem.js',{encoding:'utf8'}),
output: process.stdout
});
rl.on('line', function (line) {
var match = rexp.exec(line);
if (match) {
out.end();
console.log(path.join(PATH, match[2],'.js'));
out = fs.createWriteStream(path.join(PATH,match[2]) + '.js', {encoding:'utf8'});
}
if (!out.write(line + '\n')) {
console.log('***** paused **** ');
rl.pause();
out.once('drain', function () {
console.log('***** resume **** ');
rl.resume();
});
}
});
当我发现 write() 失败时,我会暂停 ReadLine 上的输入流,并在恢复时监听“drain”事件。我尝试让监听器永久处于“耗尽”状态,但似乎来自 ReadLine 的线路不断出现。所有文件最终都会被截断。即使暂停,ReadLine 似乎也不会停止发送“行”事件。
初始 WriteStream (out) 是在此示例之前创建的,我监听 ReadLine 流上的“close”事件以 end() 最终文件,但无论如何,所有文件(而不仅仅是最后一个文件)都会被截断。
显示屏沿正在读取的行显示控制台上的所有 ** 暂停 * 标志,但没有 恢复。所有简历**行都在最后一次出现。
提前致谢
最佳答案
我发现,这是ReadLine的错。当 ReadLine 接收到暂停()时,它会暂停自己的输入流,但如果它有一个已按行分割的缓冲区,它将继续为已从前一个缓冲区分割的每个行发出“行”事件。只有当该行数组完成时它才会停止。我已在 Node 的网站上提交了错误报告。
关于node.js - 写入流最终会溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11316382/