createWriteStream vs writeFile?

Ran*_*ndy 6 file-io stream fwrite request node.js

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

someReadStream.pipe(fs.createWriteStream('foo.png'));
Run Code Online (Sandbox Code Playgroud)

VS

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

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

他们有什么不同?

Leo*_*tny 7

当您在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));
});
Run Code Online (Sandbox Code Playgroud)

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