9

这两种操作的基本区别是什么?

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

对比

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

当使用请求库进行抓取时,我可以保存图片(png,bmp)等。只有前一种方法和后一种方法有相同的乱码(二进制)数据,但图像不呈现。

它们有何不同?

4

1 回答 1

9

当您在 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));
});

您可以通过检查输出文件的大小来发现出现问题的时间。

于 2013-01-05T10:35:50.533 回答