Node.js - 缓冲器



Node.js 中的缓冲区类对象,用于表示固定长度的字节序列。它存储的原始数据类似于整数数组,但对应于 V8 堆之外的原始内存分配。Node.js 中的 Buffer 类是 JavaScript 的 Uint8Array 类的子类。尽管实例 Buffer 类是全局对象,但建议通过 import 或 require 语句显式引用该类。

在早期版本的 Node.js 中,缓冲区对象是使用 new 运算符声明的 -


 var buf = new Buffer(10);

也可以从给定数组创建缓冲区对象 -


 var buf = new Buffer([10, 20, 30, 40, 50]);

或从给定的字符串 -


 var buf = new Buffer("Simply Easy Learning", "utf-8");

但是,现在已弃用 new 关键字。您需要使用以下静态方法来创建 Buffer 对象 -


// Creates a zero-filled Buffer of length 10.
const buf1 = Buffer.alloc(10);

// Creates an uninitialized buffer of length 10.
const buf2 = Buffer.allocUnsafe(10);

// Creates a Buffer containing array
const buf3 = Buffer.from([1, 2, 3]);

// creates a buffer from string
const buf4 = Buffer.from('hello world', 'utf8');

静态方法

alloc()

分配指定大小(以字节为单位)的新缓冲区。


 Buffer.alloc(size[, fill[, encoding]])

参数

  • size − 新缓冲区的所需长度。
  • fill − 用于预填充新缓冲区的值。默认值:0。
  • encoding − 如果 fill 是一个字符串,这就是它的编码。默认值:'utf8'。


const buf = Buffer.alloc(5);

console.log(buf);

输出

<Buffer 00 00 00 00 00>

allocUnsafe()

创建指定大小(以字节为单位)的未初始化缓冲区


 Buffer.allocUnsafe(size)


const buf = Buffer.allocUnsafe(10);

console.log(buf);

buf.fill('a');

console.log(buf);

输出

<Buffer 38 67 ff aa 32 56 00 00 08 00>
<Buffer 61 61 61 61 61 61 61 61 61 61>

from()

使用 0 – 255 范围内的字节数组分配新的缓冲区。


// Creates a new Buffer containing the UTF-8 bytes of the string 'buffer'.
const buf1 = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
console.log(buf1);

// Creates a new Buffer from integer array.
const buf2 = Buffer.from([10, 20, 30, 40, 50]);
console.log(buf2);

输出

<Buffer 62 75 66 66 65 72>
<Buffer 0a 14 1e 28 32>

from()

创建一个包含字符串的新 Buffer。


 Buffer.from(string[, encoding])

参数

  • string <string> 要编码的字符串。
  • encoding <string> 字符串的编码。默认值:'utf8'。encoding 参数标识在将字符串转换为字节时要使用的字符编码。


const buf1 = Buffer.from('Hello World');
console.log(buf1);
console.log(buf1.toString());

输出

<Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>
Hello World

compare()

将缓冲区对象与其他缓冲区对象进行比较。


 compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])

参数

  • target − 要与之比较的缓冲区。
  • targetStart − 开始比较的目标内的偏移量。默认值:0。
  • targetEnd - 目标内结束比较的偏移量(不包括在内)。默认值:target.length。
  • sourceStart − 源缓冲区内开始比较的偏移量。默认值:0。
  • sourceEnd - 源缓冲区内用于结束比较的偏移量(不包括在内)。默认值:buf.length。

该函数返回一个数字,指示第一个缓冲区是位于排序顺序之前、之后还是与其他缓冲区对象相同。

如果第二个与第一个相同,则返回 0

如果排序时第二个缓冲区应位于第一个缓冲区之前,则返回 1。

如果排序时第二个缓冲区应位于第一个缓冲区之后,则返回 -1。


var buffer1 = Buffer.from('BALL');
var buffer2 = Buffer.from('BAT');
var result = buffer1.compare(buffer2);

if(result < 0) {
	 	console.log(buffer1 +" comes before " + buffer2);
} else if(result === 0) {
	 	console.log(buffer1 +" is same as " + buffer2);
} else {
	 	console.log(buffer1 +" comes after " + buffer2);
}

输出

BALL comes before BAT

在上面的示例中,将两个 Buffer 对象更改为 −


var buffer1 = Buffer.from('CURE');
var buffer2 = Buffer.from('CORE');

输出

CURE comes after CORE

copy()

将数据从此缓冲区的某个区域复制到目标缓冲区中的某个区域,即使目标内存区域与源重叠也是如此。


 copy(target[, targetStart[, sourceStart[, sourceEnd]]])

参数

  • target − 要复制到的缓冲区。
  • targetStart − 目标内开始写入的偏移量。默认值:0。
  • sourceStart - 开始复制的 buf 内的偏移量。默认值:0。
  • sourceEnd - buf 内停止复制的偏移量(不包括在内)。默认值:buf.length。


var buffer1 = Buffer.from('Hello World');
var buffer2 = Buffer.allocUnsafe(buffer1.length);
var result = buffer1.compare(buffer2);

buffer1.copy(buffer2);
console.log("buffer2 content: " + buffer2.toString());

输出

buffer2 content: Hello World

entries()

从 Buffer 对象的内容返回 [index, byte] 对的迭代器。


var buf = Buffer.from('Hello World');
for (const pair of buf.entries()) {
	 console.log(pair);
}

输出

[ 0, 72 ]
[ 1, 101 ]
[ 2, 108 ]
[ 3, 108 ]
[ 4, 111 ]
[ 5, 32 ]
[ 6, 87 ]
[ 7, 111 ]
[ 8, 114 ]
[ 9, 108 ]
[ 10, 100 ]

slice()

返回一个由给定索引裁剪的新缓冲区


 buf.slice([start][, end])

参数

  • start − 数字,可选,默认值:0
  • end − number,可选,默认值:buffer.length

返回值

返回一个新的缓冲区,由开始(默认为 0)和结束(默认为 buffer.length)索引进行偏移和裁剪。负索引从缓冲区的末端开始。


var buffer1 = Buffer.from('QikepuComPoint');
//slicing a buffer
var buffer2 = buffer1.slice(0,9);
console.log("buffer2 content: " + buffer2.toString());

输出

buffer2 content: QikepuCom

write()

根据指定的编码将字符串写入偏移量的缓冲区。


 write(string[, offset[, length]][, encoding]) 

参数

  • string − 要写入 buf 的字符串。
  • offset − 在开始写入字符串之前要跳过的字节数。默认值:0。
  • length − 写入的最大字节数(写入的字节数不会超过 buf.length - offset)。默认值:buf.length - offset。
  • encoding - 字符串的字符编码。默认值:'utf8'。

该函数返回写入的字节数。


const buf = Buffer.alloc(256);

const len = buf.write("Simple Easy Learning");

console.log(`${len} bytes: ${buf.toString('utf8', 0, len)}`);

输出

20 bytes: Simple Easy Learning

toJSON()

返回给定缓冲区对象的 JSON 表示形式。


const buf = Buffer.from("Simple Easy Learning");

var json = buf.toJSON();
console.log(json);

输出

{
type: 'Buffer',
data: [
83, 105, 109, 112, 108, 101,
32, 69, 97, 115, 121, 32,
76, 101, 97, 114, 110, 105,
110, 103
]
}

concat()

返回一个新的 Buffer,这是连接所有 Buffer 实例的结果。


 concat(list[, totalLength])

参数

  • list − 要连接的 Buffer 或 Uint8Array 实例的列表。
  • totalLength − 连接时列表中的缓冲区实例的总长度。


var buffer1 = Buffer.from('qikepuCom');
var buffer2 = Buffer.from('Simply Easy Learning');
var buffer3 = Buffer.concat([buffer1,buffer2]);

console.log("buffer3 content: " + buffer3.toString());

输出

buffer3 content: qikepuCom Simply Easy Learning

方法参考

以下是 Node.js 中可用的 Buffers 模块的参考。有关详细信息,您可以参考官方文档。

类方法

方法 描述
Buffer.isEncoding(encoding)

如果编码是有效的编码参数,则返回 true,否则返回 false。

Buffer.isBuffer(obj)

测试 obj 是否为 Buffer。

Buffer.byteLength(string[, encoding])

给出字符串的实际字节长度。编码默认为“UTF8”。它与 String.prototype.length 不同,因为 String.prototype.length 返回字符串中的字符数。

Buffer.concat(list[, totalLength])

返回一个缓冲区,该缓冲区是将列表中的所有缓冲区连接在一起的结果。

Buffer.compare(buf1, buf2)

与 buf1.compare(buf2) 相同。用于对缓冲区数组进行排序。