banli17 / note

学习记录
https://banli17.github.io/note/docs/intro
MIT License
17 stars 2 forks source link

Node.js Buffer 模块 #110

Open banli17 opened 2 years ago

banli17 commented 2 years ago

Node.js 中的 Buffer(缓冲区) 可以看作是一块内存空间。

banli17 commented 2 years ago

为什么需要 Buffer?

引入 Buffer 是为了让 js 能操作二进制数据,文件或网络 IO 流。

如果使用字符串,字符串是不变量,每次处理字符串都会返回一个新的字符串,这会造成性能问题。

创建 Buffer 实例

Buffer 提供了三个方法 Buffer.from()、Buffer.alloc()、Buffer.allocUnsafe(),来创建 Buffer 实例。

const buf = Buffer.alloc(1024)
const buf = Buffer.allocUnsafe(1024)

实例方法

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()

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!'

静态方法

常用操作

获取 buffer 长度

const buf = Buffer.from('Hey!')
console.log(buf.length)

遍历 buffer 内容

const buf = Buffer.from('Hey!')
for (const item of buf) {
  console.log(item) // 72 101 121 33
}

改变 buffer 内容

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!