Buffer 在 node 运行时自动加载,挂载到 global 对象上,所以使用不需要 require
Buffer 是一个类似 Array 的对象,但它主要操作字节。
Buffer 所占内存不通过 V8 分配,属于 堆外内存。
Buffer 类似于数组格式,内部元素是 16 进制的两位数,即 0~255
Utf- 8 情况下,汉字占 3 位,符号和字母占一位
可通过下角标访问元素和赋值。
let buffer = new Buffer(100)
buffer[10] = -100 // 156 如果赋值比 0 小,则加上 256
buffer[20] = 300 // 44 如果赋值比 255 大,则减去 256
buffer[30] = 3.1415 // 3 小数则舍弃小数部分,保留整数
console.log(buffer[1]) // 会打印一个 0 到 255 的随机值
Buffer 内存分配不通过 v8,是因为 Buffer 的性能相关部分是通过 C ++ 实现的,所以它的内存是通过 c ++ 层面实现的。
Buffer 内存分配时,以 8kb 为界限
- 小于 8kb 的为小 Buffer:对于小 Buffer 对象,采用 slab 分配机制,c++ 先申请 8kb 的 slab 内存,如果该 slab 剩余空间足够,则在 slab 空间内分配内存给新的 Buffer,如果不足,则申请新的 slab 空间。
- 大于 8kb 的为大 Buffer:大 Buffer 对象,将会直接分配一个 SlowBuffer 对象作为 slab 空间,该 slab 空间被大 Buffer 对象独占。
Buffer 可以与字符串直接进行转换,支持以下格式
- UTF-8
- ACSII
- UTF-16LE/UCS-2
- Base64
- Hex
- Binary
Buffer 对象尽量不要使用 + 运算符进行拼接,如下代码
const fs = require(‘fs’)
let rs = fs.createReadStream(’test.txt’)
let data =‘'
rs.on(‘data’, function(chunk) {data += chunk})
rs.on(‘end’, function() {console.log(data)
})
data += chunk 这句话蕴含了 toString()转换,等价于 data = data.toString() + chunk.toString()
chunk 为 Buffer 对象,如何内部含义宽字节编码,toString()就会导致乱码。