0

第一次我用我的代码逐行读取文件。(文件中大约 1650 行)

第二,我将文件的每一行重新格式化为多行。

第三,我想将输出写入一个新文件。不幸的是,它并没有写出超过 16800 行的所有内容。输出在大约 15500 行左右变化。

第三,我使用以下代码:

var inputArr; //Splited Input of one line 
var Text; //inputArr transformed to a String with many lines (per start line)
var lineCounter = 0; //counts the expacted number of output lines

const fs = require('fs');
const writeStream = fs.createWriteStream('./output.txt');

for(var i=0; i<= inputArr.length; i++) {
  writeStream.write(Text);

  lineCounter = lineCounter + 1;
}

writeStream.end();

我该怎么做才能将所有行写入输出文件?

4

1 回答 1

0

我该怎么做才能将所有行写入输出文件?

如果不检测流何时已满,然后等待它说可以再次写入,您就无法写入大量数据。在stream.writable doc中有一个非常详细的示例说明如何做到这一点。

这是文档的摘录,显示了如何做到这一点:

// Write the data to the supplied writable stream one million times.
// Be attentive to back-pressure.
function writeOneMillionTimes(writer, data, encoding, callback) {
  let i = 1000000;
  write();
  function write() {
    let ok = true;
    do {
      i--;
      if (i === 0) {
        // last time!
        writer.write(data, encoding, callback);
      } else {
        // see if we should continue, or wait
        // don't pass the callback, because we're not done yet.
        ok = writer.write(data, encoding);
      }
    } while (i > 0 && ok);
    if (i > 0) {
      // had to stop early!
      // write some more once it drains
      writer.once('drain', write);
    }
  }
}

基本上,您必须注意返回值stream.write(),当它说流已满时,您必须重新开始写入drain事件。


您不会为阅读和写作显示整个代码。如果您只是读取流,修改它然后将结果写入不同的文件,您可能应该使用管道,也许使用转换,然后流将自动为您处理所有读取、写入和背压检测。

您可以在此处阅读有关转换流的信息,因为这听起来可能是您真正想要的。然后,您将转换流的输出通过管道传输到输出流文件,所有背压都将自动为您处理。

于 2018-11-13T08:02:00.803 回答