美文网首页
Express框架:内置模块的Buffer缓存区

Express框架:内置模块的Buffer缓存区

作者: 听书先生 | 来源:发表于2022-02-28 23:11 被阅读0次

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]]])

参数说明:

  1. encoding可选参数,指定编码格式,默认为utf8.
  2. start可选参数,开始位置,默认最开始.
  3. 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]])

参数说明:

  1. value 必填:初始化的数据
  2. start 初始化开始的位置
  3. 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]])

参数说明:

  1. start 初始化开始的位置
  2. 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>

相关文章

网友评论

      本文标题:Express框架:内置模块的Buffer缓存区

      本文链接:https://www.haomeiwen.com/subject/hkdrrrtx.html