Node缓冲区的使用方法介绍

120 阅读3分钟

了解什么是Node缓冲区,它们有什么用途,如何使用它们

什么是缓冲区?

缓冲区是内存的一个区域。JavaScript开发人员对这个概念并不熟悉,比C、C++或Go开发人员(或任何使用系统编程语言的程序员)要少得多,他们每天都在与内存互动。

它代表了在V8 JavaScript引擎之外分配的一个固定大小的内存块(不能被调整大小)。

你可以把缓冲区想象成一个整数阵列,每个整数代表一个字节的数据。

它是由NodeBuffer类实现的。

为什么我们需要一个缓冲区?

缓冲区的出现是为了帮助开发者处理二进制数据,在一个传统上只处理字符串而非二进制的生态系统中。

缓冲器与流有很深的联系。当一个流处理器收到的数据比它能消化的快时,它就会把数据放在缓冲区里。

缓冲区的一个简单的可视化是当你在观看YouTube视频时,红线超出了你的可视化点:你下载数据的速度比你观看的速度快,而你的浏览器将其缓冲。

如何创建一个缓冲区

一个缓冲区的创建是使用 Buffer.from(), Buffer.alloc(),和 Buffer.allocUnsafe()方法创建缓冲区。

const buf = Buffer.from('Hey!')

你也可以直接通过大小来初始化缓冲区。这样就创建了一个1KB的缓冲区。

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

使用缓冲区

访问缓冲区的内容

缓冲区作为一个字节数组,可以像数组一样被访问。

const buf = Buffer.from('Hey!')
console.log(buf[0]) //72
console.log(buf[1]) //101
console.log(buf[2]) //121

这些数字是识别缓冲区位置的字符的Unicode代码(H => 72, e => 101, y => 121)

你可以使用toString() 方法打印缓冲区的全部内容。

console.log(buf.toString())

请注意,如果你用一个设置缓冲区大小的数字来初始化缓冲区,你将获得预初始化的内存,其中将包含随机数据,而不是一个空的缓冲区!

获取缓冲区的长度

使用length 属性。

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
}

改变缓冲区的内容

你可以通过使用write() 方法向缓冲区写入一整串的数据。

const buf = Buffer.alloc(4)
buf.write('Hey!')

就像你可以用数组语法访问缓冲区一样,你也可以用同样的方法设置缓冲区的内容。

const buf = Buffer.from('Hey!')
buf[1] = 111 //o
console.log(buf.toString()) //Hoy!

复制一个缓冲区

使用copy() 方法可以复制一个缓冲区。

const buf = Buffer.from('Hey!')
let bufcopy = Buffer.alloc(4) //allocate 4 bytes
buf.copy(bufcopy)

默认情况下,你复制的是整个缓冲区。还有3个参数让你定义起始位置、结束位置和新的缓冲区长度。

const buf = Buffer.from('Hey!')
let bufcopy = Buffer.alloc(2) //allocate 2 bytes
buf.copy(bufcopy, 0, 2, 2)
bufcopy.toString() //'He'

分割缓冲区

如果你想创建一个缓冲区的部分可视化,你可以创建一个片断。一个片断不是一个副本:原始缓冲区仍然是真理的来源。如果这一点改变了,你的切片就会改变。

使用slice() 方法来创建它。第一个参数是起始位置,你可以指定一个可选的第二个参数的结束位置。

const buf = Buffer.from('Hey!')
buf.slice(0).toString() //Hey!
const slice = buf.slice(0, 2)
console.log(slice.toString()) //He
buf[1] = 111 //o
console.log(slice.toString())