瞭解Node緩衝區是什麼,它們用於什麼,以及如何使用它們。

緩衝區是什麼?

緩衝區是一塊內存區域。與C、C++或Go等使用系統編程語言的開發人員(或任何與內存交互的程序員)相比,JavaScript開發人員對這個概念不太熟悉,因為js開發人員並不需要直接與內存交互。

它代表著在V8 JavaScript引擎之外分配的固定大小的內存塊(無法調整大小)。

您可以將緩衝區視為一個整數數組,其中每個整數表示一個字節的數據。

它是由Node的Buffer類實現的。

為什麼我們需要緩衝區?

引入緩衝區是為了幫助開發人員處理二進制數據,在傳統上,js只處理字符串而不是二進制數據。

緩衝區與流(streams)緊密相關。當流處理器接收到的數據速度比它處理的速度快時,它將數據放入緩衝區。

對於緩衝區的一個簡單的可視化是當您觀看YouTube視頻時,紅色條超出了您的視覺點:您正在比您查看數據更快地下載數據,並且您的瀏覽器將其緩衝。

如何創建一個緩衝區

使用Buffer.from(),Buffer.alloc()和Buffer.allocUnsafe()方法來創建緩衝區。

const buf = Buffer.from('Hey!')
  • Buffer.from(array)
  • Buffer.from(arrayBuffer[, byteOffset[, length]])
  • Buffer.from(buffer)
  • Buffer.from(string[, encoding])

您還可以通過傳遞大小來初始化緩衝區。這將創建一個1KB大小的緩衝區。

const buf = Buffer.alloc(1024)
//或者
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) //分配4個字節
buf.copy(bufcopy)

默認情況下,您將複製整個緩衝區。使用3個額外參數,您可以定義開始位置,結束位置和新緩衝區的長度。

const buf = Buffer.from('Hey!')
let bufcopy = Buffer.alloc(2) //分配2個字節
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())