美文网首页
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