Buffer
Buffer类是作为Node API的一部分引入的,用于在TCP流、文件系统操作及其他上下文中与八位字节流进行交互。
一个更好的操作二进制数据的类。
暂时存放输入输出数据的一段内存。
- Buffer的大小在创建的时候确定,且无法更改;
- Buffer类在全局作用域中,所以无需引用require(‘buffer’);
- 分配的内存不在V8内存中,而是在node的C++层实现的;
- 采用slab分配机制,slab是动态内存管理机制,分为full(完全分配状态)、partial(部分分配状态)、empty(未分配状态);
创建Buffer:
- Buffer.alloc(size,string, encoding)
必填:size
非必填:string、encoding
创建的buffer是被初始化的,Buffer的每一项都用00填充 - Buffer.allocUnsafe(size,string, encoding)
创建的Buffer并没有经过初始化,在内存中只要有闲置的buffer就使用。创建Buffer使得内存分配非常快,但已分配的内存段可能包含敏感的数据,有明显性能优势却不安全。
根据内容直接创建buffer:
-
Buffer.from(buffer)
-
Buffer.from(array)
-
Buffer.from(string, encoding)
必填:string
非必填:encoding -
Buffer.from(buffer)
参数为buffer的时候,会创建一个新的buffer并复制上面的每一个成员;
Buffer为引用类型,一个Buffer复制另一个buffer的成员,当其中一个Buffer复制的成员更改,另一个Buffer对应成员跟着改变。
操作Buffer:
// 检查下buffer的结构
buf.toJSON()
buf.toJSON()
// buffer里存的是16进制数字,按照字节长度计算
buf.length
// 写入数据到buffer
buf.write()
// 解码buffer
buf.toString()
// buffer拼接
buf.concat(list[, totalLength])
// 判断对象是否为 Buffer
Buffer.isBuffer
// 判断 Buffer 对象编码
Buffer.isEncoding
// 和数组的 indexOf 类似,返回某字符串、acsii 码或者 buf 在改 buf 中的位置
buf.indexOf
// 将一个 buf 的(部分)内容复制到另外一个 buf 中
buf.copy