全局变量之buffer
Nodejs下的js可以实现IO操作进行二进制处理
Buffer可以让javascript可以操作二进制
- 无须require的一个全局变量
- 实现Nodejs平台下的二进制数据操作
- 不占据V8堆内存大小的内存空间
- 内存的使用由Node来控制,由V8的GC进行回收
- 一般配合Stream流使用,充当数据缓冲区
创建buffer
alloc
创建指定字节大小的buffer
const b1 = Buffer.alloc(10) // 创建一个占据10个字节的buffer <Buffer 00 00 00 00 00 00 00 00 00 00>
allocUnsafe
创建指定字节大小的buffer (不安全),内存有空闲,可能被其他占用
const b1 = Buffer.allocUnsafe(10) // 创建一个占据10个字节的buffer <Buffer 08 00 00 00 01 00 00 00 00 00>
from
接受数据,创建buffer
第二个参数默认是utf8
使用from进行创建的buffer,内存不是共享的
const b1 = Buffer.from("1","utf8") // <Buffer 31>
const b1 = Buffer.from("中") // <Buffer e4 b8 ad> 一个汉字三个字节
const b3 = Buffer.alloc(3);
const b4 = Buffer.from(b3);
b3[0] = 1
console.log(b3)// <Buffer 01 00 00>
console.log(b4)// <Buffer 00 00 00>
实例方法
fill 使用数据填充
- 第一个参数表示要填充的内容
- 第二个参数和第三个参数表示填充的范围
const b1 = Buffer.alloc(6) // 创建6个字节buffer
b1.fill("123") // 循环填充b1直到内存填充完毕
console.log(b1.toString()) // 123123
const buf = Buffer.alloc(6);
buf.fill("123",1,3); // 从1下标开始 3结束 不包括3
console.log(buf);
console.log(buf.toString()); // 12
write 向buffer写入数据
- 第一个参数表示要写入的内容
- 第二个参数和第三个参数表示写入的范围
const buffer = Buffer.alloc(6)
buffer.write("123",1,4)
console.log(buffer);// <Buffer 00 31 32 33 00 00>
console.log(buffer.toString()); // 123
toString 向buffer提取数据
- 第一个参数编码格式
- 第二个和第三个表示范围
const buffer = Buffer.from("大家好");
console.log(buffer); // <Buffer e5 a4 a7 e5 ae b6 e5 a5 bd>
console.log(buffer.toString()); // 大家好
slice 截取buffer
- 第一个参数开始位置
- 第二个参数结束为止
和数组差不多
indexOf 在buffer中查找数据
- 第一参数 查询的字符
- 第二个偏移量
const buffer = Buffer.from("123大家好大家好大家好");
console.log(buffer)// <Buffer 31 32 33 e5 a4 a7 e5 ae b6 e5 a5 bd e5 a4 a7 e5 ae b6 e5 a5 bd e5 a4 a7 e5 ae b6 e5 a5 bd>
console.log(buffer.indexOf("大")) // 3
console.log(buffer.indexOf("大",4)) // 12
copy 拷贝buffer
下面代码解释了如何进行拷贝
b2为拷贝源,b1是拷贝的对象,最后b2被拷贝到b1中
- 参数1: 需要拷贝的目标
- 参数2:从拷贝源第几个字节开始
- 参数3: 拷贝目标被填入的开始下标
- 参数4: 拷贝目标被填入的结束下标
const b1 = Buffer.alloc(6)
const b2 = Buffer.from("测试")
b2.copy(b1)
console.log(b1.toString()); // 测试
console.log(b2.toString()); // 测试
b2.copy(b1,3,3,6)
console.log(b1.toString()); // 试
静态方法
concat
多个buffer拼接
- 第一个参数需要拼接的buffer
- 第二个字节 指定长度
const b1 = Buffer.alloc("你好")
const b2 = Buffer.alloc("世界")
const b = Buffer.concat([b1,b2])
const b3 = Buffer.concat([b1,b2],9)
console.log(b.toString()) // 你好世界
console.log(b3.toString()) // 你好世
isBuffer
判断是否是buffer
const b1 = "123"
console.log(Buffer.isBuffer(b1)) // false