WriteStream не записывает все данные - PullRequest
0 голосов
/ 13 ноября 2018

1-й я читаю в файле строку за строкой с моим кодом.(Округлите около 1650 строк в файле)

2-й Я переформатирую каждую строку файла во множество строк.

3-й Я хотел бы записать вывод в новый файл.К сожалению, это не пишет все из более чем 16800 строк.Выходные данные варьировались примерно в 15500 строк.

Для 3-го я использую код фолдинга:

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 голосов
/ 13 ноября 2018

Что я могу сделать, чтобы записать все строки в мой выходной файл?

Вы не можете записывать большие объемы данных, не обнаружив, когда поток заполнен, а затем ожидая, пока он скажет, что все в порядке для повторной записи. Есть довольно подробный пример того, как сделать это в 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.


Вы не показываете весь свой код для чтения и записи. Если вы просто читаете поток, модифицируете его и затем записываете результат в другой файл, вам, вероятно, следует использовать конвейер, возможно с преобразованием, и тогда потоки автоматически обработают все операции чтения, записи и обратного давления для вас.

Вы можете прочитать о потоках преобразования здесь , так как это звучит так, как будто вы действительно хотите. Затем вы перенаправили бы вывод потока преобразования в файл выходного потока, и все обратное давление будет обработано для вас автоматически.

...