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,但看起来没问题。
通过检查文件大小很容易注意到什么时候出了问题。