createWriteStream vs writeFile?

时间:2013-01-05 08:53:02

标签: node.js file-io stream request fwrite

这两项操作之间的基本区别是什么?

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

VS

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

当使用请求库进行抓取时,我可以保存pics(png,bmp)等..只使用前一种方法,后者有相同的gibbersh(二进制)数据,但图像不会渲染。

他们有什么不同?

1 个答案:

答案 0 :(得分:5)

当你在node.js中使用流时,你应该更喜欢管道它们。

根据Node.js’s stream-event docsdata个事件会发出缓冲区(默认情况下)或字符串(如果设置了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));
});

通过检查输出文件的大小,您可以注意到出现问题。