Node.js 中 Stream 和 Buffer 的区别

2025年3月7日 | 阅读 5 分钟

本文将讨论 Node.js 中 StreamBuffer 之间的区别。在深入探讨区别之前,让我们先详细了解一下每个术语。

什么是 Stream?

Stream 是 Node.js 应用程序中的一个关键概念,它允许以顺序方式处理数据输入和输出的读取或写入。它们在处理文件、网络以及任何类型的数据端到端交换时特别有用。

Stream 的关键概念是数据不是一次性处理,而是以小段或块的形式处理。当处理可能过大而无法放入内存的文件时,这非常有用。Stream 允许分块处理数据,因此可以处理更大的文件。

Node.js 的 stream 模块提供了用于处理流数据的 API。Streams 是一项有用的功能,因为它使我们能够连续地处理数据,而不是一次性加载所有数据,这既可以节省内存占用,又能提高整体性能。

为什么要使用 Stream?

与其它数据处理方法相比,Streams 提供了两个关键优势。

  • 内存效率: 在 Streams 中,数据不必全部加载到 内存 中然后进行处理。而是将数据分块处理,这些数据块是系统可以处理的,从而最大限度地减少了处理数据所需的内存,并有效地利用了系统资源。
  • 时间效率: Streams 允许在接收到新信息后立即进行处理和分析,而不是等待所有数据都接收完毕。这可以缩短响应特定查询所需的时间,并提高系统性能。

Node.js 中的 Stream 类型

Node.js 中有四种主要的 Stream 类型

  • Writable: 可以在这些流中写入数据,例如 `fs.createWriteStream()`。
  • Readable: 我们可以从这些流中读取数据,例如 `fs.createReadStream()`。
  • Duplex: 既可以写入又可以读取的源。例如,`net.socket`。
  • Transform: 在读写数据的过程中可以转换数据的流,例如 `zlib.createDeflate`。

Node.js 中的 Buffer 是什么?

Node.js 中的 Buffer 类 通过执行与原始数据操作相关的操作来转换原始二进制数据。Buffer 指的是内存中的特定内存位置。Buffer 仅处理二进制数据,且不能调整大小。在 Buffer 中,每个整数代表一个 字节。console.log() 函数用于打印 Buffer 实例。

Buffer 可以归类为 Node.js 的内置模块之一,主要用于处理二进制数据,并提供一种处理二进制数据的机制。它是 Node.js 工作中的基本原理之一,在运行时环境中被广泛使用。以下是 Buffer 模块在 Node.js 中的一些重要特性:

  • 二进制数据操作: Buffer 功能帮助我们构建、管理和执行二进制数据操作。这在处理网络协议、文件 I/O 和其他数字数据操作时特别有用。
  • 内存效率: 与其他 JavaScript 字符串相比,Buffer 的创建考虑了内存效率,因为它们以原始二进制形式存储。
  • 编码和解码: Buffer 可以根据不同的字符集进行编码和解码,包括 UTF-8、ASCII、Base-64 等。这使我们能够将二进制数据解码为人类易于理解的文本,并将文本编码为二进制数据。
  • 切片和连接: 由于 Buffer 可以进行切片和连接,因此如果我们希望对二进制数据的特定部分进行操作,可以轻松完成。
  • 转换: Buffer 可以轻松地转换为其他数据类型(如 数组字符串JSON 对象),反之亦然,从而更容易与应用程序的其他部分进行交互。
  • TypedArray 兼容性: Buffer 与 TypedArray 对象兼容,TypedArray 用于以更组织化和有效的方式操作二进制数据。
  • 池化: Buffer 模块还具有池化功能,可以帮助重用为创建新 Buffer 实例预先分配的内存。
  • 字节序: Buffer 可以指定使用不同的字节序,并可以处理与特定平台无关的数据。

Node.js 中 Stream 和 Buffer 的主要区别

Difference between Stream and Buffer in Node.js

Node.js 中的 Stream 和 Buffer 之间存在一些关键区别。Stream 和 Buffer 的一些主要区别如下:

方面StreamBuffer
定义Streams 是对象,它们允许以顺序方式从源检索数据或将数据写入目标。Buffers 是内存中的中间存储,用于临时存储二进制数据。
数据处理它以分块的方式处理数据,这些分块可以被一次性处理。存储固定大小的小块数据,这些数据不会经常改变,例如二进制数据。
内存使用它占用较少的内存来处理大数据,因为它们以分块的方式处理数据。有时,它们会占用更多空间,因为它们需要足够的空间将整个数据存储在内存中。
数据流建立信息流;它可以是只读、只写或两者兼有。它不包含流机制;数据直接存储和检索。
异步它们主要用于异步操作,适用于 I/O 密集型操作。不完全是异步的;对 Buffers 的某些操作可能会阻塞事件循环。
类型四种类型
它们的基本类型包括 Readable、Writable、Duplex 和 Transform。
一种存储原始二进制数据的单一类型。
用例最适合文件操作、网络和数据处理。它特别适用于处理二进制数据,例如图片或协议文件。
性能对于大数据流更有效,因为它们不会将所有数据加载到内存中。对于大型数据集可能会导致内存和性能问题。
错误处理包含事件触发的错误处理(例如,“error”事件)。大多数错误在操作过程中进行管理,例如,数据格式转换。

结论

在 Node.js 中,StreamsBuffers 都很重要,尽管这两种工具的用途不同。Streams 用于以顺序操作处理大型数据集,允许分块处理数据而不是一次性加载所有数据。这使得它们适用于文件操作、网络以及任何对内存效率和速度要求较高的场景。另一方面,Buffers 用于处理原始二进制数据,并在内存中临时存储它们以供进一步操作。当与仅包含二进制数据的数据集一起使用时,例如图像数据处理或协议文件,它们非常高效。Streams 适用于随时间推移处理大量数据,而 Buffers 允许直接在内存中读取和写入二进制数据,因此它们各自都适用于 Node.js 操作。