Nodejs—buffer入门
概念:
buffer就是缓冲区,用来存储数据的容器,操作和数组很相似
buffer不需要引入可以直接使用
创建buffer对象的三种方式
- 第一种:alloc,会重置buffer对象
第一个参数是长度,第二个参数是设置的初始化buffer的默认值,16进制
const buf1 = Buffer.alloc(10, 16);
console.log(buf1);
结果:
- 第二种:allocUnsafe:不会重置buffer对象,可能包含没有清理掉的旧值,不安全
const buf3 = Buffer.allocUnsafe(10);
console.log(buf3);
结果:每次都会有不同的旧值
重置buffer
const buf3 = Buffer.allocUnsafe(10);
buf3.fill(); // 对buffer对象进行重置
console.log(buf3);
结果:
- 第三种:from,可以根据数据长度,动态分配buffer长度
const buf4 = Buffer.from([1, 2, 3, 4]);
console.log(buf4);
const buf5 = Buffer.from('test');
console.log(buf5);
结果:
buffer的读写与转换操作
- toString()
const buf = new Buffer.alloc(12); // 长度为12
buf.write('读写操作');
console.log(buf.toString()); // 读取,转换成字符串
结果:写入的字符每个占3个buffer长度,因此初始buffer对象的时候设置的长度为12.写入四个字符正好占12位,所以正好显示完全
如果减少初始buffer对象的长度
const buf = new Buffer.alloc(9); // 长度为9
buf.write('读写操作');
console.log(buf.toString()); // 读取,转换成字符串
结果:结果只出现三个字
如果初始设置的buffer对象长度并不是3的倍数
const buf = new Buffer.alloc(10); // 长度为10
buf.write('读写操作');
console.log(buf.toString()); // 读取,转换成字符串
结果:最后一个字依旧无法显示,但会出现一个空格
如果初始设置的buffer对象长度比写入字符的长度要大
const buf = new Buffer.alloc(15); // 长度为15
buf.write('读写操作');
console.log(buf.toString()); // 读取,转换成字符串
结果:会出现空格
这个时候使用from方法就会很方便,因为from方法可以动态分配buffer长度
const buf1 = new Buffer.from('读写操作');
console.log(buf1.toString());
结果:不需要给初始buffer设置长度,而造成过短或过长而出现不完整或空格的现象,直接会动态分配
- toJSON()
const buf = new Buffer.from([1, 2, 3, 4]);
console.log(buf.toJSON());
console.log(JSON.stringify(buf));
结果: 两种书写方式输出结果一样
buffer常用api 操作和数组很相似
- 合并:类方法
const buf1 = new Buffer.from('test');
const buf2 = new Buffer.from('Nodejs');
const buf3 = Buffer.concat([buf1, buf2]); // 注意是数组
console.log(buf3.toString());
结果:
- 比较: 实例方法
const buf1 = new Buffer.from('abc');
const buf2 = new Buffer.from('abc');
console.log(buf1.compare(buf2));
结果:
const buf1 = new Buffer.from('abc');
const buf2 = new Buffer.from('abcdef');
console.log(buf1.compare(buf2));
结果:
const buf1 = new Buffer.from('abcdef');
const buf2 = new Buffer.from('abc');
console.log(buf1.compare(buf2));
结果:
因此:比较只有三种结果
// 0代表相等,
// 1,调用方法的Buffer对象长度大于另一个Buffer对象,
// -1,调用方法的Buffer对象长度小于另一个Buffer对象
- 拷贝:实例方法
const buf1 = new Buffer.from('abcaa');
const buf2 = new Buffer.from('edf');
buf2.copy(buf1)
console.log(buf1.toString());
结果:把buf2的值拷贝给了buf1,buf2只有三位
- 截取:实例方法
const buf1 = new Buffer.from('abcd');
console.log(buf1.slice(0, 2).toString());
结果:
// 第一个参数:截取的起始位置
// 第二个参数:代表结束的位置,在这个位置之前的被截取
- 长度:属性
const buf1 = new Buffer.from('abcd');
console.log(buf1.length);
结果:
也可以测试中文长度
const buf1 = new Buffer.from('测试')
console.log(buf1.length);
结果: