2013-01-05 103 views
4

這兩個操作之間的基本區別是什麼?createWriteStream vs 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)等。僅與前者的方法,並與後者有相同gibbersh(二進制)數據但圖像不呈現。

它們有什麼不同?

+0

你確定'chunk's不是緩衝區嗎?緩衝區串聯並不那麼簡單。 –

回答

3

當你在node.js中使用流時,你應該更喜歡管道它們。

根據Node Docs「數據」事件發出緩衝區(默認)或字符串(如果編碼已設置)。

當您使用文本流時,可以使用'data'事件將所有數據塊連接在一起。然後,您可以像使用常規字符串一樣處理數據。

但是,當你使用二進制數據時,它並不是那麼簡單,因爲你會接收緩衝區。要連接緩衝區,你應該使用特殊的方法,如Buffer.concat。因此,可以將這種方法用於二進制流,但不值得痛苦。


更新

如果你想這樣做硬盤的方式,請嘗試以下代碼:

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

我便無法測試,但它看起來確定。

通過檢查文件大小很容易發現問題出在哪裏。

+0

感謝那對我而言,但我無法實現它'硬'的方式! 。 var buffers = []; ('data',function(chunk){var_lb = new Buffer(chunk.length); buffers.push(blob); }); readstrm.on( '結束' 功能(){ \t變種finalblob = Buffer.concat(緩衝器); \t fs.writeFile( 'img.bmp',finalblob); }); – Randy

+0

我做了一次,它的工作......雖然在節點0.6.x沒有'concat',所以我使用了github中的一些節點模塊。 –

+0

我更新了我的答案,但我的代碼看起來非常像您的代碼。 –