📜  Node.js 中的缓冲区是什么?(1)

📅  最后修改于: 2023-12-03 14:44:42.197000             🧑  作者: Mango

Node.js 中的缓冲区是什么?

在 Node.js 中,Buffer 类被用于在 TCP 流、文件系统操作、以及其他上下文中与二进制数据进行交互。

什么是缓冲区?

缓冲区是一块临时存储区,用来存放输入输出的数据。在其他语言中也称为数组。但是在 Node.js 中,Buffer 类是一个全局变量,因此在使用时无需引入。

如何创建缓冲区?

在 Node.js 中,可以使用以下两种方式来创建缓冲区:

  • 使用 Buffer.alloc() 方法创建指定大小的缓冲区。
  • 使用 Buffer.from() 方法从指定的字节数组或字符串创建缓冲区。

注意:在使用 Buffer.alloc() 方法创建缓冲区时,新创建的缓冲区是被初始化的。如果要创建未被初始化的缓冲区,应该使用 Buffer.allocUnsafe() 方法。

// 创建一个包含 10 个字节的未被初始化的缓冲区
const buf1 = Buffer.allocUnsafe(10);

// 创建一个包含 10 个字节的被初始化为 0 的缓冲区
const buf2 = Buffer.alloc(10);

// 使用字符串创建缓冲区
const buf3 = Buffer.from('hello world', 'utf8');

// 使用字节数组创建缓冲区
const buf4 = Buffer.from([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
如何读写缓冲区?

可以使用以下几种方式来读写缓冲区中的数据:

  • buf[index]:获取或设置缓冲区中指定位置的字节。
  • buf.slice([start[, end]]):返回一个新的缓冲区,包含原始缓冲区中指定位置的数据。
  • buf.length:返回缓冲区的字节数。
  • buf.toString([encoding[, start[, end]]]):将缓冲区中的数据转换为字符串。
  • buf.write(string[, offset[, length]][, encoding]):将一个字符串写入缓冲区中。
// 创建一个包含 'hello world' 的缓冲区
const buf = Buffer.from('hello world');

// 读取缓冲区中的数据
console.log(buf[0]); // 104
console.log(buf.slice(0, 5).toString()); // 'hello'
console.log(buf.length); // 11
console.log(buf.toString('utf8')); // 'hello world'

// 写入数据到缓冲区中
buf.write('hi', 0, 2);
console.log(buf.slice(0, 2).toString()); // 'hi'
console.log(buf.toString('utf8')); // 'hi llo world'
缓冲区与字符编码

在 Node.js 中,缓冲区中的数据都是以字节(byte)为单位存储的。而在字符串中,每个字符都是以 UTF-8、UTF-16、ASCII 等编码方式存储的。因此,在读写缓冲区时,需要注意编码方式的转换。

可以使用 toString() 方法来将缓冲区中的数据转换为字符串。默认情况下,toString() 方法将缓冲区中的数据转换为 UTF-8 编码的字符串。如果要指定其他编码方式,可以将编码方式作为第一个参数传递给 toString() 方法。

// 创建一个包含 '你好' 的缓冲区(UTF-8 编码为 2 个字节)
const buf = Buffer.from('你好');

// 将缓冲区中的数据转换为字符串
console.log(buf.toString()); // '你好'

// 将缓冲区中的数据转换为 GBK 编码的字符串
console.log(buf.toString('gbk')); // '浣犲ソ'
结论

Buffer 类是 Node.js 中处理二进制数据的核心之一。熟练掌握 Buffer 类的使用,可以在处理文件、网络通信等场景中更加得心应手。