Buffer是什么?
Buffer作為存在于全局對象上,無需引入模塊即可使用,你絕對不可以忽略它。
可以理解Buffer是在內存中開辟的一片區域,用于存放二進制數據。Buffer所開辟的是堆外內存。
Buffer的應用場景有哪些?
流
怎么理解流呢?流是數據的集合(與數據、字符串類似),但是流的數據不能一次性獲取到,數據也不會全部load到內存中,因此流非常適合大數據處理以及斷斷續續返回chunk的外部源。流的生產者與消費者之間的速度通常是不一致的,因此需要buffer來暫存一些數據。buffer大小通過highWaterMark參數指定,默認情況下是16Kb。
存儲需要占用大量內存的數據
Buffer 對象占用的內存空間是不計算在 Node.js 進程內存空間限制上的,所以可以用來存儲大對象,但是對象的大小還是有限制的。一般情況下32位系統大約是1G,64位系統大約是2G。
如何創建Buffer
除了流自動隱式創建Buffer之外,也可以手動創建Buffer,方式如下:
Buffer中存儲的數據已確定
Buffer.from(obj)  // obj支持的類型string, buffer, arrayBuffer, array, or array-like object
注意:Buffer.from不支持傳入數字,如下所示:
Buffer.from(1234);buffer.js:208 throw new errors.TypeError( ^TypeError [ERR_INVALID_ARG_TYPE]: The "value" argument must not be of type number. Received type number at Function.from (buffer.js:208:11) ...
若要傳入數字可以采用傳入數組的方式:
const buf = Buffer.from([1, 2, 3, 4]);console.log(buf); // <Buffer 01 02 03 04>
但是這種方式存在一個問題,當存入不同的數值的時候buffer中記錄的二進制數據會相同,如下所示:
const buf2 = Buffer.from([127, -1]);console.log(buf2); // <Buffer 7f ff>const buf3 = Buffer.from([127, 255]);console.log(buf3); // <Buffer 7f ff>console.log(buf3.equals(buf2)); // true
當要記錄的一組數全部落在0到255(readUInt8來讀取)這個范圍, 或者全部落在-128到127(readInt8來讀取)這個范圍那么就沒有問題,否則的話就強烈不推薦使用Buffer.from來保存一組數。因為不同的數字讀取時應該調用不同的方法。
Buffer存儲數據未確定
Buffer.alloc、Buffer.allocUnsafe、Buffer.allocUnsafeSlow
Buffer.alloc會用0值填充已分配的內存,所以相比后兩者速度上要慢,但是也較為安全。當然也可以通過--zero-fill-buffers flag使allocUnsafe、allocUnsafeSlow在分配完內存后也進行0值填充。
node --zero-fill-buffers index.js
當分配的空間小于4KB的時候,allocUnsafe會直接從之前預分配的Buffer里面slice空間,因此速度比allocUnsafeSlow要快,當大于等于4KB的時候二者速度相差無異。
新聞熱點
疑難解答
圖片精選