Node.js 系列:缓存区(Buffer)

68 阅读2分钟

目的:

Buffer就是在内存中开辟一片区域(初次初始化为8KB),用来存放二进制数据

其形式可以理解成一个数组,数组中的每一项,都可以保存8位二进制:00000000,也就是一个字节

实际上是在V8堆内存之外分配了一块内存,这是因为V8的垃圾回收机制主要是针对js对象的,而二进制数据如果放在V8堆内存中,可能会导致性能问题

为什么需要

Nodejs不能控制数据传输的速度和到达时间,只能决定何时发送数据,如果还没到发送时间,则将数据放在Buffer中,即在RAM中,直至将它们发送完毕

  • 如果数据到达的速度比进程消耗的速度,那么少数早到达的数据会处于等待区等候被处理。
  • 反之,如果数据到达的速度比进程消耗的速度慢,那么早先到达的数据需要等待一定量的数据到达之后才能被处理

实际场景:

  • 数据形式除了简单的文本形式,还有可能是存储图片、音频、视频等非文本格式的数据
  • 网络通信
  • I/O操作:如fs文件读取,默认情况下就是数据先存储在buffer中
  • 操作数据库
  • 加解密
  • zlib.js:zlib.js 为 Node.js 的核心库之一,其利用了缓冲区(Buffer)的功能来操作二进制数据流,提供了压缩或解压功能

Buffer方法

  • Buffer.from('H'): 创建
    • 参数可以是字符串
    • 参数也可以是数组
  • Buffer.alloc(10): 分配10个字节创建
  • Buffer.write(): 写入Buffer,返回写入的字节数
  • Buffer.toString('ascii'): 将二进制转为字符串,默认utf-8
    • 编码与解码不是相同的格式则会出现乱码
    • 设定的范围导致字符串被截断的时候,也会存在乱码
  • Buffer.slice():提取一部分
  • Buffer.equals() :比较两个Buffer是否相等

所支持的字符集有如下:

  • ascii:仅支持 7 位 ASCII 数据,如果设置去掉高位的话,这种编码是非常快的
  • utf8:多字节编码的 Unicode 字符,许多网页和其他文档格式都使用 UTF-8
  • utf16le:2 或 4 个字节,小字节序编码的 Unicode 字符,支持代理对(U+10000至 U+10FFFF)
  • ucs2,utf16le 的别名
  • base64:Base64 编码
  • latin:一种把 Buffer 编码成一字节编码的字符串的方式
  • binary:latin1 的别名,
  • hex:将每个字节编码为两个十六进制字符