Buffer 和 Strem
前言Buffter(缓冲器)Buffer 与迭代器Buffer 类Stream(流)流的类型可读流Buffer 与 Stream 之间的转换Stream to BufferBuffer to Stream工具类 ts参考
前言
Buffter 与 Stream 对于 Node.js 的初学者来说极其容易迷糊,通过对比学习我们可以更好的分清楚他们的区别。
Buffter(缓冲器)
在引入 TypedArray 之前,JavaScript 没有读取或操作二进制数据流的机制。 Buffer 类用于在 TCP 流或文件系统操作等场景中处理字节流。
现在有了 TypedArray,Buffer 类以一种更优化、更适合 Node.js 的方式实现了 Uint8Array。
Buffer 类的实例类似于整数数组,但 Buffer 的大小是固定的、且在 V8 堆外分配物理内存。 Buffer 的大小在创建时确定,且无法改变。
Buffer 类是一个全局变量,使用时无需 require('buffer').Buffer。
Buffer 与迭代器
Buffer 可以使用 for..of 进行迭代:
还可以使用 buf.values()、buf.keys()、与 buf.entries() 创建迭代器。
Buffer 类
Buffer.alloc(size[, fill[, encoding]])
- size
<integer>
新建的 Buffer 的长度。
- fill
<string>
|<Buffer>
|<integer>
预填充 Buffer 的值。默认为 0。
- encoding
<string>
如果 fill 是字符串,则指定 fill 的字符编码。默认为 'utf8'。
创建一个大小为 size 字节的 Buffer。 如果 fill 为 undefined,则用 0 填充 Buffer。
Buffer.compare(buf1, buf2)
- buf1
<Buffer>
|<Uint8Array>
- buf2
<Buffer>
|<Uint8Array>
- 返回:
<integer>
比较 buf1 与 buf2,主要用于 Buffer 数组的排序。 相当于调用 buf1.compare(buf2)。
Buffer.concat(list[, totalLength])
- list
<Buffer[]>
|<Uint8Array[]>
要合并的 Buffer 数组或 Uint8Array 数组。
- totalLength
<integer>
合并后 Buffer 的总长度。
- 返回:
<Buffer>
返回一个合并了 list 中所有 Buffer 的新 Buffer。
如果 list 中没有元素、或 totalLength 为 0,则返回一个长度为 0 的 Buffer。如果没有指定 totalLength,则计算 list 中的 Buffer 的总长度。如果 list 中的 Buffer 的总长度大于 totalLength,则合并后的 Buffer 会被截断到 totalLength 的长度。
Buffer.from(array)
- array
<integer[]>
使用字节数组 array 创建 Buffer。
// 创建一个包含字符串 'buffer' 的 UTF-8 字节的 Buffer。
const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
Buffer.from(arrayBuffer[, byteOffset[, length]])
- arrayBuffer
<ArrayBuffer>
|<SharedArrayBuffer>
ArrayBuffer 或 SharedArrayBuffer,或 TypedArray 的 .buffer 属性。
- byteOffset
<integer>
开始拷贝的索引。默认为 0。
- length
<integer>
拷贝的字节数。默认为 arrayBuffer.length - byteOffset。
创建 ArrayBuffer 的视图,但不会拷贝底层内存。例如,当传入 TypedArray 的 .buffer 属性的引用时,新建的 Buffer 会与 TypedArray 共享同一内存。
Buffer.from(buffer)
- buffer
<Buffer>
|<Uint8Array>
要拷贝数据的 Buffer 或 Uint8Array。
拷贝 buffer 的数据到新建的 Buffer。
Buffer.from(string[, encoding])
- string
<string>
要编码的字符串。
- encoding
<string>
string 的字符编码。默认为 'utf8'。
将 Base64 编码的字符串转成 十六进制 的字符串:
Buffer.isBuffer(obj)
- obj
<Object>
- 返回:
<boolean>
如果 obj 是一个 Buffer,则返回 true,否则返回 false。
Stream(流)
Stream(流)是 Node.js 中处理流式数据的抽象接口。 Stream 模块用于构建实现了流接口的对象。
Node.js 提供了多种流对象。 例如,HTTP 服务器的请求 和 process.stdout 都是流的实例。
流可以是可读的、可写的、或者可读可写的。 所有的流都是 EventEmitter 的实例。
流的类型
Node.js 中有四种基本的流类型:
- Writable - 可写入数据的流(例如 fs.createWriteStream())。
- Readable - 可读取数据的流(例如 fs.createReadStream())。
- Duplex - 可读又可写的流(例如 net.Socket)。
- Transform - 在读写过程中可以修改或转换数据的 Duplex 流(例如 zlib.createDeflate())。
可读流
可读流是对提供数据的来源的一种抽象。
可读流的例子包括:
所有可读流都实现了 stream.Readable 类定义的接口。
完整的可以参考:stream-handbook
Buffer 与 Stream 之间的转换
Stream to Buffer
Stream 最有效的操作是将它们传输到另一个流。这在文件系统操作中很常见,但是在处理 HTTP 请求时,我们可能希望直接将响应流转换为 JSON 对象或解析 url 编码的值。这个时候我们可以将 Stream 读取到缓冲区,将 Stream 对象转换成 Buffer 对象。
此函数获取流(可能来自 HTTP 或 FS 访问)。 然后它会将每个 Buffer push 置于 Buffers 数组。 当流已被完全读取时,它将所有这些缓冲区与 Buffer.concat 组合在一起。这显然会导致大流的一些问题,但它适用于需要在应用程序的后续部分中在内存中转换和携带的小流。
Buffer to Stream
此操作创建双工字符串,并简单地将缓冲区写入其中。 流现在可以用作通常的任何写流。
工具类 ts
参考
Loading...