createWriteStream против writeFile?

В чем принципиальная разница между этими двумя операциями?

someReadStream.pipe(fs.createWriteStream('foo.png'));

vs

someReadStream.on('data', function(chunk) { blob += chunk } );
someReadStream.on('end', function() { fs.writeFile('foo.png', blob) });

При использовании библиотеки запросов для очистки я могу сохранять изображения (png, bmp) и т. д. только с помощью первого метода, а со вторым есть те же данные тарабарщины (двоичные), но изображение не отображается.

Насколько они разные ?


person Randy    schedule 05.01.2013    source источник
comment
Вы уверены, что chunk не являются буферами? Конкатенация буферов не так проста.   -  person Leonid Beschastny    schedule 05.01.2013


Ответы (1)


Когда вы работаете с потоками в node.js, вы должны предпочесть их конвейерную передачу.

Согласно документам потоковых событий Node.js, data события создают либо буферы (по умолчанию ) или строки (если было установлено encoding).

Когда вы работаете с текстовыми потоками, вы можете использовать события data для объединения фрагментов строковых данных. Тогда вы сможете работать со своими данными как с одной строкой.

Но при работе с бинарными данными все не так просто, потому что вы будете получать буферы. Для объединения буферов используются специальные методы, такие как Buffer.concat. Аналогичный подход можно использовать и для бинарных потоков:

var buffers = [];
readstrm.on('data', function(chunk) {
    buffers.push(chunk);
});
readstrm.on('end', function() {
    fs.writeFile('foo.png', Buffer.concat(buffers));
});

Вы можете заметить, когда что-то пойдет не так, проверив размер выходного файла.

person Leonid Beschastny    schedule 05.01.2013
comment
спасибо, это открыло мне глаза, но я тоже не могу добиться этого «трудным путем»! . переменные буферы = []; readstrm.on('data', function(chunk) { var blob = new Buffer(chunk.length); buffers.push(blob); }); readstrm.on('end', function() { var finalblob = Buffer.concat(buffers); fs.writeFile('img.bmp', finalblob); }); - person Randy; 05.01.2013
comment
Я сделал это один раз, и это сработало ... Однако в узле 0.6.x не было concat, поэтому я использовал какой-то модуль узла из github. - person Leonid Beschastny; 05.01.2013
comment
Я обновил свой ответ, но мой код очень похож на ваш. - person Leonid Beschastny; 05.01.2013