1、Buffer缓存区
缓存区指的就是在内存中开辟一块临时区域用于存储运算的字节码。
Buffer缓存区的作用:提升文件传输的效率
1.1、Buffer如何创建
Buffer是一个全局的类,不需要加载便可以使用
- 1、使用new关键字创建一个能存放10个字节的缓存区
let buf = new Buffer(10);
// 需要注意的是:未来某种情况下new Buffer
// 可能会被废弃,需要更换写法
// Buffer.alloc()、Buffer.allocUnsafe(), or Buffer.from()
- 2、在创建的buf缓存区中写入'ab'字符
buf.write('ab');
打印buf得到输出内容:
<Buffer 61 62 00 00 00 00 00 00 00 00>
图1.png
因此a对应的十六进制数为61,b对应的十六进制数为62。
1.2、指定数组长度创建Buffer
对于创建Buffer,我们可以指定我们需要存储的内存大小。
let buf1 = Buffer.alloc(4);
buf1.write('dshkjhkjhjkxjasgvhvxjhgavshgvhg')
console.log(buf1);
//<Buffer 64 73 68 6b> 只会存储4个字符
1.3、使用from创建Buffer缓存区
通过需要存储的值来创建Buffer缓存区。
let buf1 = Buffer.from('abcgdhsagjhhgjkadsmlk');
console.log(buf1);
//<Buffer 61 62 63 67 64 68 73 61 67 6a 68 68 67 6a 6b 61 64 73 6d 6c 6b>
1.4、拷贝Buffer缓存区
不同的缓存区之间还能进行相互之间的内容拷贝(下例将buf1中的数据拷贝至buf2中)
let buf1 = Buffer.alloc(5);
buf1.write('abcdefgh')
console.log('buf1:', buf1); // <Buffer 61 62 63 00 00 00 00 00 00 00>
let buf2 = Buffer.alloc(20);
console.log('拷贝前:',buf2);
// <Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>
buf1.copy(buf2);
console.log('拷贝后:',buf2);
// <Buffer 61 62 63 64 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>
1.5、获取Buffer缓存区的长度
let buf2 = Buffer.alloc(20);
console.log('长度:',buf2.length); // 20
1.6、Buffer缓存区的内容与字符串之间的转换
解码缓存区数据并使用指定的编码返回字符串
将buffer的内容转换为字符串的格式:
buffer.toString([encoding[.start[.end]]])
参数说明:
- encoding可选参数,指定编码格式,默认为utf8.
- start可选参数,开始位置,默认最开始.
- end可选参数,结束位置,默认的结束位置.
let buf4 = Buffer.from('This is a string');
console.log('buffer缓存区:', buf4); // <Buffer 54 68 69 73 20 69 73 20 61 20 73 74 72 69 6e 67>
console.log('转换为字符串:', buf4.toString()) // 转换为字符串: This is a string
截取部分缓存区进行字符串的转换:
需要注意的是,如果截取的部分无法识别将会出现乱码。
let buf4 = Buffer.from('This is a string');
console.log('buffer缓存区:', buf4); // <Buffer 54 68 69 73 20 69 73 20 61 20 73 74 72 69 6e 67>
console.log('转换为字符串:', buf4.toString('utf-8',2,8)) // 转换为字符串: is is
1.7、Buffer缓存区的填充
语法格式:
buffer.fill(value [, start, [, end]])
参数说明:
- value 必填:初始化的数据
- start 初始化开始的位置
- end 初始化结束的位置
let buf5 = Buffer.alloc(10);
buf5.fill('abc', 2); //从索引为2的位置上开始填充
console.log(buf5); // <Buffer 00 00 61 62 63 61 62 63 61 62>
buffer.fill是填充的操作,因此,在索引为2的位置上开始会一直往后面进行填充,直到最末尾。
拓展:数组中的ES6中的fill创建空数组的弊端
使用fill直接创建了3个{}对象
let array = new Array(3).fill({});
console.log(array); // [ {}, {}, {} ]
接着我们尝试改变数组中的第一个对象的属性:
let array = new Array(3).fill({});
console.log(array); // [ {}, {}, {} ]
array[0].name = 'test';
console.log(array); // [ { name: 'test' }, { name: 'test' }, { name: 'test' } ]
会惊奇的发现:所有数组中的对象的属性都被改变了,因此,直接使用这种方式创建空对象是存在问题的。
正确创建数组中空对象的方式:
let array = new Array(3).fill(null).map(() => { return {}});
console.log(array); // [ {}, {}, {} ]
array[0].name = 'test';
console.log(array); // [ { name: 'test' }, {}, {} ]
因此,这样创建的数组中的空对象才是互相独立存在的。
1.8、Buffer缓存区的切割
语法格式:
buffer.slice([, start, [, end]])
参数说明:
- start 初始化开始的位置
- end 初始化结束的位置
注意,切割的位置不会包括末端位置(左闭右开区间)
let buf6 = Buffer.from('abcfdgsa');
console.log('buf6:', buf6);
const buf7 = buf6.slice(1,4); // bcf
console.log(buf7.toString()); // bcf
1.9、Buffer缓存区的判断
判断一个对象是不是Buffer对象
语法格式:
buffer.isBuffer(obj)
参数说明:
返回值:布尔值
console.log(Buffer.isBuffer(buf7)); // true
1.10、Buffer缓存区的合并
类似数组的concat,执行先后顺序的合并
const buf8 = Buffer.concat([buf6, buf7]);
console.log(buf8); // <Buffer 61 62 63 66 64 67 73 61 62 63 66>
网友评论