2016-03-22 5 views
0

Скажем, у меня есть файл, содержащий список целых чисел, по одному на строку. Я использую fs.createReadStream и передаю его в split (так что каждый кусок является целым числом). Затем я передаю это в дуплексный поток, который должен добавить числа и записать сумму по трубопроводу в fs.createWriteStream.подождите, пока предыдущий поток будет пустым, прежде чем разрешить чтение

var fs = require('fs'); 
var stream = require('stream'); 
var split = require('split'); 

var addIntegers = new stream.Duplex(); 

addIntegers.sum = 0; 

addIntegers._read = function(size) { 
    this.push(this.sum + '\n'); 
} 

addIntegers._write = function(chunk, encoding, done) { 
    this.sum += +chunk; 
    done(); 
} 

fs.createReadStream('list-of-integers.txt') 
    .pipe(split()) 
    .pipe(addIntegers) 
    .pipe(fs.createWriteStream('sum.txt')); 

Когда я запускаю это, sum.txt просто получает постоянно заполняются нулями, и программа никогда не заканчивается (как и ожидалось). Как подождать, пока входной поток (split) будет пустым, прежде чем разрешить поток вывода (fs.createWriteStream) читать с addIntegers?

+1

Почему бы не 'push()' in '_write()' вместо этого? – mscdex

+0

Хмм да, я мог бы использовать поток преобразования и 'this.push (this.sum + '\ n')' в '_write'. Я получаю текущую сумму, которая намного лучше, чем нули навсегда. Однако есть ли способ получить общую сумму? (пишите один раз в 'sum.txt' вместо n раз?). Я понимаю, что после этого могу просто «tail -n 1 sum.txt», но мне было интересно, есть ли идиоматический способ «узла» получить то, что я хочу. – aeoliant

ответ

0

Я понял.

Я решил использовать поток Transform вместо (спасибо mscdex), потому что он имеет метод (_flush), который вызывается после того, как все записанные данные будут уничтожены. Рабочий код приведен ниже. Не забудьте указать npm i split :)

var fs = require('fs'); 
var stream = require('stream'); 
var split = require('split'); 

var addIntegers = new stream.Transform(); 

addIntegers.sum = 0; 

addIntegers._transform = function(chunk, encoding, done) { 
    this.sum += +chunk; 
    done(); 
} 

addIntegers._flush = function(done) { 
    this.push(this.sum + '\n'); 
} 

fs.createReadStream('list-of-integers.txt') 
    .pipe(split()) 
    .pipe(addIntegers) 
    .pipe(fs.createWriteStream('sum.txt')); 
Смежные вопросы