【问题标题】:createWriteStream vs writeFile?createWriteStream 与 writeFile?
【发布时间】:2012-12-19 15:54:39
【问题描述】:

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

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

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

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

它们有什么不同?

【问题讨论】:

  • 你确定chunks 不是缓冲区吗?缓冲区串联并不是那么简单。

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


【解决方案1】:

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

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

【讨论】:

  • 感谢这让我大开眼界,但我也无法通过“艰难的方式”实现它! .变量缓冲区 = []; readstrm.on('data', function(chunk) { var blob = new Buffer(chunk.length); buffers.push(blob); }); readstrm.on('end', function() { var finalblob = Buffer.concat(buffers); fs.writeFile('img.bmp', finalblob); });
  • 我做了一次,它成功了......虽然节点 0.6.x 中没有 concat,所以我使用了来自 github 的一些节点模块。
  • 我更新了我的答案,但我的代码看起来很像你的。
猜你喜欢
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
相关资源
最近更新 更多