当前位置: 首页 > 面试题库 >

如何在Node.js中一次将一个可读流传输到两个可写流中?

锺离嘉茂
2023-03-14
问题内容

目标是:

  1. 创建文件读取流。
  2. 用管道将其压缩到gzip(zlib.createGzip()
  3. 然后将zlib输出的读取流通过管道传输到:

1)HTTP response对象

2) 可写文件流,以保存压缩后的输出。

现在我可以降到3.1了:

var gzip = zlib.createGzip(),
    sourceFileStream = fs.createReadStream(sourceFilePath),
    targetFileStream = fs.createWriteStream(targetFilePath);

response.setHeader('Content-Encoding', 'gzip');

sourceFileStream.pipe(gzip).pipe(response);

…效果很好,但是我还需要 将压缩后的数据保存到文件中, 这样我就不需要每次都进行zip压缩,并且能够直接将压缩后的数据作为响应流化。

那么,如何在Node中一次将一个可读流传送到两个可写流中?

sourceFileStream.pipe(gzip).pipe(response).pipe(targetFileStream);在节点0.8.4工作?


问题答案:

我发现zlib返回了一个可读流,该流随后可通过管道传递到多个其他流中。因此,我执行以下操作来解决上述问题:

var sourceFileStream = fs.createReadStream(sourceFile);
// Even though we could chain like
// sourceFileStream.pipe(zlib.createGzip()).pipe(response);
// we need a stream with a gzipped data to pipe to two
// other streams.
var gzip = sourceFileStream.pipe(zlib.createGzip());

// This will pipe the gzipped data to response object
// and automatically close the response object.
gzip.pipe(response);

// Then I can pipe the gzipped data to a file.
gzip.pipe(fs.createWriteStream(targetFilePath));


 类似资料:
  • 问题内容: 我需要连续运行两个命令,这些命令需要从同一流中读取数据。将流传输到另一个流之后,缓冲区将被清空,因此我无法再次从该流读取数据,因此无法正常工作: 要求 对此抱怨 和改变 的inputStream 到收益率,当然同样的问题。我不想写入文件,而是以某种方式 重用 请求 产生的流(或与此相关的任何其他流)。 一旦可读流完成管道传输,是否可以重用?完成上述示例的最佳方法是什么? 问题答案: 您

  • 问题内容: 我有一个由Java 8流表示的数据集: 我可以看到如何对其进行过滤以获取随机子集-例如 我还可以看到如何减少该流,例如得到两个表示数据集的两个随机一半的列表,然后将它们转换回流。但是,是否有直接方法可以从最初的一个生成两个流?就像是 感谢您的任何见解。 问题答案: 不完全是。您不可能一分之二。这没有道理-您将如何遍历一个而不需要同时生成另一个?流只能操作一次。 但是,如果要将它们转储到

  • 问题内容: 问:我怎样才能从读到的一切入的方式是不是一个手工制作的循环用我自己的字节的缓冲区? 问题答案: 编写一个方法来执行此操作,然后从需要该功能的任何地方调用它。番石榴已经在中提供了代码。我敢肯定,几乎所有其他具有“通用” IO功能的库也都有它,但是Guava是我第一个“入门”库。它震撼了:)

  • 我有一个输入流,我想将其写入HttpServletResponse。有一种方法,由于使用字节[],需要花费的时间太长 我想知道在速度和效率方面,什么可能是最好的方法。

  • 我目前正在使用一个名为s3-upload-stream的Node.js插件,将非常大的文件传输到Amazon S3。它使用multipart API,并且在很大程度上工作得很好。 是否有一种方法可以使aws-sdk成为我可以将流管道传输到的东西?

  • 我目前正在尝试轻松地将消息从一个Kafka集群上的主题流式传输到另一个集群(远程)- 所以假设WordCount演示在另一台PC上的一个Kafka-Instance上,而不是我自己的PC上。我也有一个Kafka-Instance在我的本地机器上运行。 现在我想让WordCount演示在包含应该计算单词的句子的Topic(“远程”)上运行。 然而,计数应该写入我本地系统上的Topic而不是“远程”T