Node.js Buffer(缓冲区)
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个Buffer
类,该类用来创建一个专门存放二进制数据的缓存区。
Buffer类存在的意义
- Buffer 类是随 Node 内核一起发布的核心库。Buffer 库可以存储原始数据,让Node.js 处理二进制数据;
- 每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。
Buffer类是以字节数组的方式进行存储数据
Buffer类的基本操作
创建Buffer类
Buffer.alloc(size[, fill[, encoding]])
:返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0。
//创建一个长度为5、且用0x1填满的Buffer
const buf1 = Buffer.alloc(5,1);
//<Buffer 01 01 01 01 01>
Buffer.from(array)
: 使用0-255范围内的字节数组array来分配一个新的Buffer。如果array不是一个Array或适用于Buffer.from()变量的其他类型,则抛出TypeError。
//创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf2 = Buffer.from([1, 2, 3]);
//<Buffer 0x1 0x2 0x3>
const buf4 = Buffer.from([0x42,0x75,0x66,0x66,0x65,0x72])
//若要验证buf4,利用toString()方法即可--返回一个解码过的 string 类型
console.log(buf4.toString());
//Buffer
// 创建一个包含 UTF-8 字节[0x42,0x75,0x66,0x66,0x65,0x72]的 Buffer。
const buf3 = Buffer.from('Buffer');
//<Buffer 42 75 66 66 65 72>
buf.toString()方法可以将指定的字符编码将buf解码成字符串。传入star和end可以只解码buf的子集
写入缓冲区
buf.write(string[, offset[, length]][, encoding])
:返回实际写入的大小。如果 buffer 空间不足, 则只会写入部分字符串。根据 encoding 指定的字符编码将 string 写入到 buf 中的 offset 位置。
let buf = Buffer.alloc(5);
let len = buf.write('hello');
console.log(len);//5
//2表示要跳过两位
buf.write('hello',2,3)
console.log(buf);
// hel
length 要写入的最大字节数(写入的字节数不会超出 buf.length - offset)。默认值: buf.length - offset。
== 判断Buffer类==
Buffer.isBuffer(obj)
:如果 obj 是一个 Buffer,则返回 true,否则返回 false。
const buf = Buffer.from('hello');
console.log(Buffer.isBuffer(buf));//true
console.log(Buffer.isBuffer({}));//false
检查字符编码名称
Buffer.isEncoding(encoding)
:如果 encoding 是支持的字符编码的名称,则返回 true,否则返回 false。
console.log(Buffer.isEncoding('utf-8'));
// 返回: true
console.log(Buffer.isEncoding('hex'));
// 返回: true
console.log(Buffer.isEncoding('utf/8'));
// 返回: false
console.log(Buffer.isEncoding(''));
// 返回: false
将 Buffer 转换为 JSON 对象
buf.toJSON()
:返回 buf 的 JSON 格式。 当字符串化 Buffer 实例时,JSON.stringify()
会调用该函数。
const buf = Buffer.from('hello');
const json = JSON.stringify(buf);
console.log(json);
//{"type":"Buffer","data":[104,101,108,108,111]}
JSON.stringify()该方法是转换为json格式的字符串
返回Buffer的长度
Buffer.byteLength(string[, encoding])
:当使用 encoding 进行编码时,返回字符串的字节长度。
let buf = Buffer.from('中国');
console.log(buf);//<Buffer e4 b8 ad e5 9b bd>
console.log(Buffer.byteLength(buf));//返回6
//返回的长度取决于编码格式
let buf1 = Buffer.from('中国','ascii');
console.log(Buffer.byteLength(buf2));//返回2
注意:
utf-8
的编码格式:一个字符=三个字节
ascii
的编码格式:一个字符=一个字节
拼接Buffer类
Buffer.concat(list[, totalLength])
:返回一个合并了 list 中所有 Buffer 实例的新 Buffer。
// 用含有三个 `Buffer` 实例的数组创建一个单一的 `Buffer`
const buf = Buffer.alloc(1);
console.log(buf.length);//1
const buf1 = Buffer.alloc(2);
console.log(buf1.length);//2
const buf2 = Buffer.alloc(3);
console.log(buf2.length);//3
const buf3 = Buffer.concat([buf,buf1]);
console.log(buf3);//<Buffer 00 00 00>
const buf1 = Buffer.from('tom');
const buf2 = Buffer.from('jerry');
const buf3 = Buffer.concat([buf1,buf2]);
console.log(Buffer.byteLength(buf3));
console.log(buf3.toString())
//8
//tomjerry
剪裁缓冲区
buf.slice([start[, end]])
:返回一个新的 Buffer,它引用与原始的 Buffer 相同的内存,但是由 start 和 end 索引进行偏移和裁剪。
let buf = Buffer.from('hello');
let buf1 = buf.slice(2,3);
console.log(buf1);//<Buffer 6c>
console.log(buf1.toString());//1
总结
1.Buffer类的一些基本操作与数组的一些方法有共通之处,比如slice()
方法、concat()
方法等,因此我们可以联想记忆;
2.在js中每种编码格式的规则不同,返回Buffer类的长度时,会根据编码格式不同而不同,比如utf-8编码格式中,一个字符代表三个字节,ASCII中一个字符代表一个字节;
3.利用Buffer.from()
方法返回的是16进制的结果,而通过Buffer.toJSON
方法返回的是10进制的结果。