buffer与stream互相转换

  |  
  1. 流到缓冲区

第一个操作是将读取流转换为缓冲区。Streams 最有效的操作是将它们通过管道传输到另一个流。这在您不想增加内存使用量的文件系统访问中很常见。

但是,在处理 HTTP 请求时,您可能希望直接将响应流转换为 JSON 对象或解析 url 编码值。

为此,您将读取缓冲区 data 事件提供的数据。Streams 将提供一个字符串或一个缓冲区作为数据事件的值。这取决于 Buffer 是否有编码集。默认情况下,它会在 data 事件期间输出 Buffers 。

这意味着您可以执行以下操作以从流中读取。

1
2
3
4
5
6
7
8
function streamToBuffer(stream) {
return new Promise((resolve, reject) => {
let buffers = [];
stream.on("error", reject);
stream.on("data", (data) => buffers.push(data));
stream.on("end", () => resolve(Buffer.concat(buffers)));
});
}

此函数获取流(可能来自 HTTP 或 FS 访问)。然后它将每个 Buffer 推送到一个 Buffer 数组中。当流被完全读取时,它会将所有这些 Buffers 与 Buffer.concat 结合起来。

这显然会对大流造成一些问题,但对于需要在应用程序的后续部分中转换并在内存中携带的小流来说,它非常有用。

  1. 缓冲区到流
    下一部分是将 Buffer 转换为流。当您想将数据通过管道传输到现有流中时,这很有用。
1
2
3
4
5
6
7
let Duplex = require("stream").Duplex;
function bufferToStream(buffer) {
let stream = new Duplex();
stream.push(buffer);
stream.push(null);
return stream;
}

此操作创建一个双工字符串并简单地将缓冲区写入其中。该流现在可以像通常的任何写入流一样使用。

文档:
缓冲到节点中的流

文章目录