在Node.js里,JavaScript天生擅长处理字符串,但面对文件读写、网络传输、压缩解压等场景时,数据往往是以二进制字节流形式存在的。这时候就需要Buffer类来填补语言层面的空白。Buffer相当于在V8堆外内存中分配的一段固定长度缓冲区,可以直接按字节存取数据,而不被字符串编码所限制。

Buffer类的主要作用
1. 处理二进制数据
无论是读取本地文件还是接收TCP请求,底层都是字节。Buffer让开发者能以数组方式操作这些字节。
2. 编码转换桥梁
Buffer可以在UTF-8、ASCII、Base64等编码之间互相转换,方便接口对接。
3. 提升性能
相比频繁拼接字符串,使用Buffer处理大块数据能减少内存拷贝和GC压力。
常见使用方式
下面演示如何创建Buffer以及进行简单读写:
// 创建一个长度为5的Buffer并填充0
const buf = Buffer.alloc(5);
// 写入字符串,按utf8编码
buf.write('hi');
console.log(buf); // <Buffer 68 69 00 00 00>
// 从Buffer读取字符串
console.log(buf.toString('utf8')); // hi
// 拼接两个Buffer
const a = Buffer.from('你好', 'utf8');
const b = Buffer.from('世界', 'utf8');
const c = Buffer.concat([a, b]);
console.log(c.toString()); // 你好世界
与字符串的区别
| 对比项 | 字符串 | Buffer |
|---|---|---|
| 数据形式 | 字符序列 | 字节序列 |
| 编码 | 由语言决定 | 可指定多种编码 |
| 内存位置 | V8堆内 | 堆外独立内存 |
实际应用场景
- 读取和写入文件内容
- 解析HTTP请求体与响应体
- 加密解密、压缩解压数据
- 处理图片、音视频等媒体流
可以看到,Buffer类在Node.js中承担着连接JavaScript与底层二进制世界的职责。掌握它的作用和API,是编写稳定高效服务端程序的基础。