Open banli17 opened 2 years ago
引入 Buffer 是为了让 js 能操作二进制数据,文件或网络 IO 流。
如果使用字符串,字符串是不变量,每次处理字符串都会返回一个新的字符串,这会造成性能问题。
Buffer 提供了三个方法 Buffer.from()、Buffer.alloc()、Buffer.allocUnsafe(),来创建 Buffer 实例。
const buf = Buffer.alloc(1024)
const buf = Buffer.allocUnsafe(1024)
alloc()
分配时会用零初始化 buffer,alloc 的第二个参数可以指定初始值。allocUnsafe()
不会初始化 buffer,可能包含旧数据(会造成数据访问和泄漏,所以不安全),但是速度比 alloc() 快slice() deprecated
: 使用 subarray 代替subarray() 用来创建 buffer 切片,注意切片不是拷贝,如果原 buffer 改变,切片也会改变。
const buf = Buffer.from('Hey!')
buf.subarray(0).toString() // Hey!
const slice = buf.subarray(0, 2)
console.log(slice.toString()) // He
buf[1] = 111 // o
console.log(slice.toString()) // Ho
set() 方法用来拷贝 buffer。
const buf = Buffer.from('Hey!')
const bufcopy = Buffer.alloc(4) // allocate 4 bytes
bufcopy.set(buf)
默认情况下,会拷贝整个 buffer,如果想拷贝一部分,可以使用 subarray() 并设置 offset 参数。
const buf = Buffer.from('Hey?')
const bufcopy = Buffer.from('Moo!')
bufcopy.set(buf.subarray(1, 3), 1)
console.log(bufcopy.toString()) // 'Mey!'
const buf = Buffer.from('Hey!')
console.log(buf.length)
const buf = Buffer.from('Hey!')
for (const item of buf) {
console.log(item) // 72 101 121 33
}
const buf = Buffer.alloc(4)
buf.write('Hey!')
也可以使用数组语法:
const buf = Buffer.from('Hey!')
buf[1] = 111 // o in UTF-8
console.log(buf.toString()) // Hoy!
Node.js 中的 Buffer(缓冲区) 可以看作是一块内存空间。