关于NodeJS的的buffer

1.什么是buffer

通过buffer的英文翻译,为容器,缓冲区。是的,翻译的没错,在Node里面,buffer就是缓冲区的意思

那既然是缓冲区,缓冲谁呢,为什么要缓冲呢,怎么缓冲呢?

在Node应用中,处理网络协议,操作数据库吗,处理图片等,都需要想内存中传送二进制数据,然后二进制数据又被进程消耗使用。问题是有时候数据到达内存的速度比进程消耗得快,有时候又慢,这就很麻烦,这就相当于一会有剩余,一会又不够,那剩余和不够的怎么办呢,那就放在需要一个容器里,如果是多余的,你就在这等会,一会处理你。如果是不够的,你也等会,等凑够了在处理你。

这个容器就是buffer。

那这个容器具体怎么实现呢:就是在内存中开辟一块区域,初次初始化为8kb,用来存放二进制数据。 因为Node不能控制数据传输的速度和到达时间,只能决定合适发送数据,如果还没到发送时间,就将数据放在buffer里面,直至将他们发送完毕。因为buffer是用来存储二进制数据的,其形式可以理解为一个二进制数组,数组的每一项都可以保存8位二进制:比如01000100,也就是一个字节。

2.buffer的使用

  • Buffer是全局类型,不需要导入
  • 我们只需要创建一个Buffer就可以使用了
  • 常见的创建方式有Buffer.from()和Buffer.alloc()
  • Buffer.from可以创建string类型的、array类型的、buffer类型

Buffer.from()创建:

let b1=Buffer.from('hello','utf8')
let b2=Buffer.from([1,5,10])
let b3=Buffer.from(b2)
console.log(b1,b2,b3)//<Buffer 68 65 6c 6c 6f> <Buffer 01 05 0a> <Buffer 01 05 0a>

Buffer.alloc()创建指定大小的缓冲区:

let b1=Buffer.alloc(10)//创建一个大小为10字节的缓冲区
let b2=Buffer.alloc(10,5)//创建一个大小为10字节的缓冲区,并且全部填充为5
console.log(b1,b2)//<Buffer 00 00 00 00 00 00 00 00 00 00> <Buffer 05 05 05 05 05 05 05 05 05 05>

3.buffer编码和解码

buffer的二进制数据可以通过toString进行解码,在创建和和解码的时候可以指定编码和解码方式,必须一致才能解码。

let b1=Buffer.from('hello','utf8')
console.log(b1)//<Buffer 68 65 6c 6c 6f> <Buffer 01 05 0a> <Buffer 01 05 0a>
console.log(b1.toString('utf8'))//hello

4.buffer的应用

buffer经常与流的概念联系在一起使用比如进行I/O操作等。

let fs = require('fs');
fs.readFile('./images/avatar.jpg', function(err, originBuffer) {
    
    
    console.log(Buffer.isBuffer(originBuffer));

    // 生成图片2(把buffer写入到图片文件)
    fs.writeFile('./images/avatar2.jpg', originBuffer, function(err) {
    
    
        if(err) {
    
    console.log(err)}
    });

    let base64Img = originBuffer.toString('base64');  // base64图片编码字符串

    console.log(base64Img);

    let decodeImg = new Buffer(base64Img, 'base64');  // new Buffer(string, encoding)
    console.log(Buffer.compare(originBuffer, decodeImg));  // 0 表示一样
    // 生成图片3(把base64位图片编码写入到图片文件)
    fs.writeFile('./images/avatar3.jpg', decodeImg, function(err) {
    
    
        if(err) {
    
    console.log(err)}
    });
});

这时候目录中会出现三种一样的图片。
在这里插入图片描述