node.js学习记录: 理解Buffer

Buffer是一个类数组对象,里面存储的是字节,有点类似于字节数组,我们常用的场景是网络请求时对流数据的处理或文件操作时对字符串的处理。

在Node中,应用需要处理网络协议、操作数据库、处理图片、接收上传文件等,在网络流和文件的操作中,还要处理大量二进制数据,JavaScript自有的字符串远远不能满足这些需求(javascript字符串是utf-8存储的,处理二进制数据能力很弱,而网络层对于不同资源的请求响应和文件都是二进制数据来交互的),于是Buffer对象应运而生,nodejs提供了这么一个接口,来创建一个专门存放二进制数据的缓存区,并提供一些方法对缓存区数据进行处理。

Buffer(直译 缓冲,nodejs中用于处理二进制的数据)在nodejs中可以全局访问,不需要用require关键字加载

Buffer是一个像Array的对象,但它主要用于操作字节。

图片描述

我们可以发现,Buffer是一个对象,也是一个构造函数,具有自己的属性和静态方法,通过它new出来的实例,代表可以把引擎分配出一段内存,基本是一段数组,它的元素为16进制的两位数,即0到255的数值。

我们可以从模块结构对象结构层次两方面来认识。

  • 模块结构

Buffer是一个典型的JavaScript与C++结合的模块,性能相关部分用C++实现,飞性能相关部分用JavaScript实现。

  • buffer对象
1.new Buffer(size):分配一个新的 buffer 大小是 size 的8位字节. 
2.new Buffer(array):分配一个新的 buffer 使用一个8位字节 array 数组. 
3.new Buffer(str, [encoding]):encoding String类型 - 使用什么编码方式,参数可选.

4.类方法: Buffer.isEncoding(encoding):如果给定的编码 encoding 是有效的,返回 true,否则返回 false。 
5.类方法: Buffer.isBuffer(obj):测试这个 obj 是否是一个 Buffer. 返回Boolean
6.类方法: Buffer.concat(list, [totalLength]):list {Array}数组类型,Buffer数组,用于被连接。totalLength {Number}类型 上述Buffer数组的所有Buffer的总大小。
> new Buffer ('Hello 镜心的小树屋','base64')
<Buffer 1d e9 65 a0>

图片描述

  • Buffer 内存分配

Buffer对象的内存分配不是在V8的堆内存中,而是在Node的C++层面实现内存的申请,在Javascript中分配内存。
为了高效使用申请的内存,Node采用slab分配机制。
slab就是一块申请好的固定大小的内存区域,slab有三种状态:

  • full:完全分配状态
  • partial:部分分配状态
  • empty: 没有分配状态

当我们需要一个Buffer对象,可以通过以下方式分配指定大小Buffer对象

new Buffer(size)

Node以8KB为界限来区分Buffer是大对象还是小对象
图片描述

这个8KB的值就是每个slab的大小值,在JavaScript层面,以它作为单位单元进行内存的分配

  • 写入缓冲区
var buffer = new Buffer(8);//创建一个分配了8个字节内存的缓冲区
console.log(buffer.write('a','utf8'));//输出1

这会将字符"a"写入缓冲区,node返回经过编码以后写入缓冲区的字节数量,这里的字母autf-8编码占用1个字节。

  • 复制缓冲区

Node.js提供了一个将Buffer对象整体内容复制到另一个Buffer对象中的方法。我们只能在已经存在的Buffer对象之间复制,所以必须创建它们。

buffer.copy(bufferToCopyTo)

其中,bufferToCopyTo是要复制的目标Buffer对象。如下示例:

var buffer1 = new Buffer(8);
buffer1.write('nice to meet u','utf8');
var buffer2 = new Buffer(8);
buffer1.copy(buffer2);
console.log(buffer2.toString());//nice to meet u

进一步了解 看这篇 https://github.com/ElemeFE/no...

ES6的TypedArray

图片描述

面试常见问题

Buffer 一般用于处理什么数据? 其长度能否动态变化? more

参考:

ArrayBuffer MDN
nodejs buffer api
《深入浅出 nodejs》朴灵
慕课网 进击Node.js基础(二)
nodejs Docs
https://github.com/ElemeFE/no...

未完待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值