WriteStream不会写入所有数据

时间:2018-11-13 07:58:13

标签: javascript node.js createwritestream

首先我用我的代码逐行读取了文件。 (文件中约有1650行)

第二次,我将文件的每一行重新分成多行。

3rd我想将输出写入一个新文件。不幸的是,它并没有写超过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();

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

1 个答案:

答案 0 :(得分: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事件。


您不会同时显示阅读和写作的全部代码。如果您只是读取一个流,对其进行修改,然后将结果写入另一个文件,则可能应该使用管道传输,也许要进行转换,然后流将为您自动处理所有读取,写入和反压检测。

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