这两种操作的基本区别是什么?
someReadStream.pipe(fs.createWriteStream('foo.png'));
和
someReadStream.on('data', function(chunk) { blob += chunk } );
someReadStream.on('end', function() { fs.writeFile('foo.png', blob) });
当使用请求库进行抓取时,我可以保存图片(png, bmp)等。只有前一种方法和后一种方法有相同的乱码(二进制)数据,但图像不渲染。
当你在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));
});
您可以通过检查输出文件的大小来注意到什么时候出了问题。