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