Buffer(二进制缓冲区)
Buffer 是一段按字节解释的有限内存区域;本页维护二进制缓冲区的通用心智模型,Node.js 的具体 Buffer API 由专门笔记承接。
#concept
#growing
#dev
[!info] related notes
- Node.js 实现: Node.js Buffer
- 流式边界: stream
- 文件 I/O: fs
- Node.js 运行时: Node.js 中的 JavaScript
Buffer(二进制缓冲区)
Buffer 的核心不是某个框架 API,而是“用一段有限字节区域承载尚未被解释成更高层对象的数据”。网络、文件、压缩、加密和媒体处理都会遇到它。
一句话定义
Buffer 是一段按字节读写的有限内存区域;编码、端序和数据结构决定这些字节最终代表什么。
边界:概念模型 vs Node.js API
本页是通用概念层,回答“二进制缓冲区是什么、为什么存在、怎样与字符串和流区分”。Node.js Buffer 是这个概念在 Node.js 中的一套具体类型与 API,负责 Buffer.from()、alloc()、编码转换和数值读写等运行时细节。
因此:
- “一批字节为什么需要暂存、何时应该流式处理”属于本页;
- “
Buffer.allocUnsafe()是否会清零”属于 Node.js Buffer; - 浏览器里的
ArrayBuffer/ TypedArray 与 Node.jsBuffer都可以承载二进制数据,但不是同一个 API; - Buffer 描述有限的一块数据,Stream 描述随时间到达的数据序列,两者经常配合而不是互相替代。
为什么需要 Buffer
系统程序经常需要处理:
- 文件读写
- 网络数据包
- 图片、音视频
- 压缩解压
- 加密数据
这些都需要直接操作字节。
一个具体实现:Node.js Buffer
下面只用 Node.js 展示“字节区域如何被创建、编码和拼接”;完整 API 统一维护在 Node.js Buffer。
创建
// 从字符串
const buf1 = Buffer.from('hello');
const buf2 = Buffer.from('你好', 'utf8');
// 从数组
const buf3 = Buffer.from([0x48, 0x65, 0x6c, 0x6c, 0x6f]);
// 指定大小(零填充)
const buf4 = Buffer.alloc(1024);
读写
const buf = Buffer.from('hello');
// 转字符串
buf.toString(); // 'hello'
buf.toString('utf8'); // 'hello'
buf.toString('hex'); // '68656c6c6f'
// 读取单个字节
buf[0]; // 104 ('h')
// 写入单个字节
buf[0] = 72;
拼接
const a = Buffer.from('hello');
const b = Buffer.from(' world');
const c = Buffer.concat([a, b]);
c.toString(); // 'hello world'
与 String 的区别
| 关注点 | String | Buffer |
|---|---|---|
| 语义 | 已解释的文本字符 | 尚待解释的字节序列 |
| 编码 | 字符串已经具有文本语义 | 字节转文本时必须选择编码 |
| 操作单位 | 字符 / code unit | byte |
| 典型用途 | 文本处理 | 文件、网络、加密、媒体 |
不要把“Buffer = 堆外内存”当作定义。不同语言和运行时可以用不同方式分配底层存储;Buffer 的稳定语义是受边界约束的一段字节数据。
最容易误解的点
- Buffer 是概念,Node.js
Buffer是具体实现;不要把两者完全等同。 - “有一块 Buffer”不代表已经知道其内容语义;编码、端序和协议结构仍需另行解释。
- Buffer 与 Stream 的差异不是“小数据/大数据”这么简单,而是有限块与随时间到达的序列。
- 在 Node.js 中,
Buffer.allocUnsafe()、切片共享内存等实现细节统一看 Node.js Buffer。
学习检查
- 为什么一段 UTF-8 字节在解码前更适合被看作 Buffer,而不是 String?
- Buffer 与 Stream 各自抽象的是什么,为什么网络读取经常同时用到两者?
- “Buffer 一定是堆外内存”为什么不是稳定定义?
- 给一段文件数据,哪些信息必须明确后才能把字节可靠解释成文本或数值?
放回主题图里看
- 流式处理:stream
- 文件系统:fs
- Node 运行时总览:Node.js 中的 JavaScript