buffer缓冲器
Buffer
是一个和数组类似的对象,不同的是Buffer是专门用来保存二进制数据。
可以将获取的图片,视频,音频等文件转为二进制数据保存
-
特点
- 大小固定: 在创建时就确定了,且无法调整
- 性能较好:直接对计算机内存进行操作
- 每个元素大小为1字节(byte)
-
使用
> Buffer
[Function: Buffer] {
poolSize: 8192,
from: [Function: from],
of: [Function: of],
alloc: [Function: alloc],
allocUnsafe: [Function: allocUnsafe],
allocUnsafeSlow: [Function: allocUnsafeSlow],
isBuffer: [Function: isBuffer],
compare: [Function: compare],
isEncoding: [Function: isEncoding],
concat: [Function: concat],
byteLength: [Function: byteLength],
[Symbol(kIsEncodingSymbol)]: [Function: isEncoding]
- 创建Buffer
不推荐使用new
的方式创建Buffer对象,这样极其浪费性能
推荐
使用
1 使用Buffer.alloc()
创建Buffer对象,性能较new打的方式要强
let buffer = Buffer.alloc(10);
//创建长度为10的buffer对象
console.log(buffer);
//<Buffer 00 00 00 00 00 00 00 00 00 00>
2 使用Buffer.allocUnsafe()
创建,性能是最好的
let buffer = Buffer.allocUnsafe(12);
console.log(buffer);
//<Buffer 00 20 00 00 00 00 00 00 00 00 00 00>
注意此种方式创建的buffer对象并不为空
原因
1 垃圾回收机制
当一段堆中的值失去指针(引用)时,那么这段数据将会被垃圾回收机制回收,然而垃圾回收并不是每时每刻都在查找,而是每隔一段时间进行查找
2 使用new创建的buffer
在创建buffer对象时,首先去堆中划分一个空间,无论这个空间包含是不是没有被垃圾回收的空间,new都会将划分的空间进行一次清理,这是buffer实例获得的空间就是一个干净的空间
3 使用alloc()创建buffer
在创建buffer时,也是首先去堆中划分一个空间,但是这个划分的空间一定会是一个干净的空间,无需清理。
4 使用allocUnsafe()创建buffer
首先在堆划分空间,划分的空间有可能包含未被回收机制及时清理的部分,但是这个方法不会去管理清理这段空间,所以有时候这种方式返回的对象中可能包含垃圾值。
在实际使用中,前两种使用较多
问题?
为什么buffer实例输出的不是二进制,而是16进制?
输出的时候是16进制,但是保存的时候还是2进制
- 存入数据
//存入数据
let callValue = Buffer.from('hello node');
console.log(callValue);
//<Buffer 68 65 6c 6c 6f 20 6e 6f 64 65>
为什么返回的数值不是字符串?
因为用户存入的数据不一定就是字符串,可能是媒体类型的数据
这种情况如果返回的是字符串,那么将会出现问题
通过toString()
方法可以将这段返回的数据转为字符串
//存入数据
let callValue = Buffer.from('hello node');
console.log(callValue.toString());
//'hello node'