2

我正在使用 ReadLine 逐行读取一个非常大的文件,以便能够检测到可以将其拆分为有意义的部分到其他几个文件中的位置。我使用 WriteStream 写入这些文件。当正则表达式检测到剪切位置时,我 end() 当前打开的 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 流上侦听“关闭”事件以 end() 最终文件,但无论如何,所有文件,而不仅仅是最后一个文件,都会被截断。

显示屏显示所有**暂停*控制台上的标志沿着正在阅读的线条,但没有恢复. 所有resume **行在最后一次全部出现。

提前致谢

4

1 回答 1

2

我发现,这是 ReadLine 的错。当 ReadLine 接收到 pause() 时,它会暂停自己的输入流,但如果它有一个缓冲区已经拆分为行,它将继续为已经从前一个缓冲区拆分的每一行发出“行”事件。它只会在该行数组完成时停止。我已经在 Node 的网站上提交了错误报告。

于 2012-07-04T06:59:36.667 回答