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(二进制)数据,但图像不会呈现。

他们有什么不同?

当你在node.js中使用stream时,你应该更喜欢pipe道。

根据节点文档的 “数据”事件发出缓冲区(默认)或string(如果编码已设置)。

在处理文本stream时,可以使用“数据”事件将所有数据块连接在一起。 然后,您将可以像使用常规string一样处理数据。

但是,当你使用二进制数据时,并不是那么简单,因为你会接收缓冲区。 连接缓冲区你应该使用特殊的方法,如Buffer.concat 。 所以,可以将这种方法用于二进制stream,但不值得痛苦。


更新

如果你想做的很难,请尝试下面的代码:

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

我无法testing,但看起来没问题。

通过检查文件大小很容易注意到什么时候出了问题。