Buffer是nodeJS中的二進制緩存操做模塊內容。先來看一段簡短的代碼。javascript
// 建立一個長度爲 十、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10); // 建立一個長度爲 十、且用 0x1 填充的 Buffer。 const buf2 = Buffer.alloc(10, 1); // 建立一個長度爲 十、且未初始化的 Buffer。 // 這個方法比調用 Buffer.alloc() 更快, // 但返回的 Buffer 實例可能包含舊數據, // 所以須要使用 fill() 或 write() 重寫。 const buf3 = Buffer.allocUnsafe(10); // 建立一個包含 [0x1, 0x2, 0x3] 的 Buffer。 const buf4 = Buffer.from([1, 2, 3]); // 建立一個包含 UTF-8 字節 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。 const buf5 = Buffer.from('tést'); // 建立一個包含 Latin-1 字節 [0x74, 0xe9, 0x73, 0x74] 的 Buffer。 const buf6 = Buffer.from('tést', 'latin1');
由上面可知,實際上buffer對象內容展現給咱們的時候其實是一連串的二進制形式的內容,固然咱們能夠經過不一樣的二進制編碼標準來轉化當前的字符串內容,經常使用的編碼(固然也是默認的)是UTF8,這是JS一向使用的編碼方式,咱們也能夠選擇ascii等等其餘類型的編碼。下面咱們來了解一下Buffer模塊中的一些方法吧。java
首先須要知道的一點就是在新版本的nodeJS之中buffer的構造器獲取相關的值的方式已經擯棄了,如今主要是三個Buffer的類方法。下面咱們先來了解一下這三個方法內容。node
-- Buffer.alloc(size, [fill, [encoding]]):傳遞的三個參數分別爲,buffer的大小,填充每個佔位的字符內容,以及以什麼編碼格式初始化,編碼格式默認爲UTF8。這裏上一段代碼。。。編程
console.log(Buffer.alloc(10)); //展現 <Buffer 00 00 00 00 00 00 00 00 00 00> console.log(Buffer.alloc(10, 1)); //展現 <Buffer 01 01 01 01 01 01 01 01 01 01> console.log(Buffer.alloc(10, 300)); //展現 <Buffer 2c 2c 2c 2c 2c 2c 2c 2c 2c 2c>
由上面能夠看出其是以兩位16進制數來進行數據的填充的,當咱們的想要是使用300進行填充的時候,實際上其轉換成爲而進制的時候爲9位,這node將其內容捨棄了最高位,由此編程了2C即44。數組
-- Buffer.allocUnsafe(size): 這一方法內容傳遞的是分配內存大小,可是並不會自動的填充內容。Buffer會將內存模塊內容分配製定的大小並返回,可是能夠從方法內容來看到這一方法是不安全的,由於不自動填充,因此其中分配出來的內存塊內容可能存在以前的數據內容,可能會致使安全的問題。可是因爲這一函數的快速和便捷因此有時仍是會使用,可是通常最好仍是和fill方法同時使用,能夠將分配的內存中的數據替換掉,並保證安全性。緩存
-- Buffer.allocUnsafeSlow(size): 這是另一個不安全的方法內容,一樣是分配一個size大小的內存區域,可是和上面方法不一樣的地方是,這一方法不初始化底層內存信息,固然企業有可能包含敏感信息,因此也須要配合fill方法來使用。(而allocUnsafe方法,當分配的內存小於 4KB 時,默認會從一個單一的預分配的 Buffer 切割出來。 這使得應用程序能夠避免垃圾回收機制因建立太多獨立分配的 Buffer 實例而過分使用。 這個方法經過像大多數持久對象同樣消除追蹤與清理的需求,改善了性能與內存使用。)安全
-- Buffer.from():from方法內容傳遞的內容和alloc-開頭的方法不一樣了,這一方法傳遞的是數組,字符串參數或者是一個buffer對象內容。咱們直接上代碼。函數
這一段代碼能夠充分說明Buffer.from的多態了。固然要注意的一點就是在傳遞的數據爲數組的時候,其中的起始位置內容其實是無效的,只有當咱們傳遞的第一個參數是ArrayBuffer,即Buffer數組才行。性能
-- Buffer.byteLength(string,[encoding]): 返回一個字符串字符數,第二個參數可能會影響到返回內容的長度,由於不一樣的編碼內容會影響當前字符內容的轉化方式。測試
-- Buffer.compare(buf1, buf2): 比較兩個buffer對象內容,一般用於數組排序。
-- Buffer.concat(list, [totalLength]):合併Buffer或者是Uint8Array的實力數組。
-- Buffer.isBuffer(obj):判斷傳遞的參數是否是Buffer對象。
-- Buffer.isEncoding(encode):判斷當前的Buffer內容的編碼與傳遞的編碼格式是否相同。
-- Buffer.poolSize:用於決定預分配的、內部 Buffer 實例池的大小的字節數。 這個值能夠修改。
以上是Buffer模塊提供的類方法內容,固然其針對實例對象該內容也是有許多的內容。接下來咱們來看一看。
-- 受限咱們須要知道的是其實Buffer對象相似於數組的,咱們能夠經過下標的形式來獲取相應位置的值,看一段代碼吧
圖中展現能夠看出,咱們獲取的Buffer對象其實是以每一個8位內容爲一個數位。用相似數組的下標形式來獲取相應的數位內容。固然找事出來的內容和其中Buffer對象實例的內容是不相同的是由於,實例中的每個數位用的是16進制的形式展現的,而當咱們獲取相關的數據的時候則轉變成爲了10進制。
-- 實例對象之中有一個buffer屬性,能夠獲取底層的ArrayBuffer對象內容。直接上代碼。
> te.buffer
ArrayBuffer { byteLength: 8192 }
咱們這裏說明一下ArrayBuffer對象吧。這一內容能夠在MDN中的javascript標準庫中的看到,引用文檔中說明 —— ArrayBuffer對象被用來表示一個通用的,固定長度的原始二進制數據緩衝區,可是用戶對於這一對象的內容是不能進行直接性質的額操做的。咱們能夠經過使用類型化數組對象內容或者是DataView對象內容來進行緩衝區數據內容的讀寫。這裏所說的類型化數組對象其實就是TypedArray對象,可是其實不能經過new來直接獲取新的對象的,可是存在不少的方法能夠獲取這一對象的實例內容,例如以下方法。
Int8Array();
Uint8Array();
Uint8ClampedArray();
Int16Array();
Uint16Array();
Int32Array();
Uint32Array();
Float32Array();
Float64Array();
這些方法的調用能夠直接獲取TypedArray對象內容,具體內容能夠看一看MDN這裏就不在細說了。這裏有一個TypedArray的博客內容(點這裏)
-- buf.compare(target[, targetstart [, targetend [, sourcestart [, sourceend]]]]):主要的參數就是target,傳遞的是要與buf對象比較的另外一個Buffer對象,後面的參數都是偏移量一類的內容咯。相信字面上仍是很好理解的。其返回結果卻是須要說明一下,其標明在buf在排序上面排在target前,後,或是相同位置。比較的方式是基於實際的字符串序列,若是target與buf相同則是0,若是target排在buf前面則返回1,若是排在buf後面則返回-1,看段代碼:
-- buf.entries():返回一個遍歷對象,經過for... of循環來遍歷,返回的是[index, value]的形式的選項內容。上代碼:
const buf = Buffer.from('buffer');
// 輸出:
// [0, 98]
// [1, 117]
// [2, 102]
// [3, 102]
// [4, 101]
// [5, 114]
for (const pair of buf.entries()) { console.log(pair); }
-- buf,equals(otherBuffer):比較當前兩個Buffer對象內容,若是兩個Buffer對象擁有相同的字符級內容,則返回相同,不然返回false
-- buf.fill(value [, offset [, end]] [, encoding]): 填充函數,以前的代碼中也有已使用到,填充Buffer對象中的每個數位爲傳遞的參數內容。
-- buf.include(value [, byteoffset] [, encoding]):測試當前的buffer對象之中是否囊括了傳遞進入的value值,value的類型能夠是字符串,buffer對象或者是整數。第二個數字內容是肯定從Buf對象的第幾個數位開始查找內容,第三個參數只有在Value內容爲字符串的狀況之下才能生效,表示將會把value轉化成爲何編碼形式的內容來比對。
-- buf.indexOf(value [,byteoffset] [,encoding]):測試當前的value是否存在於Buf對象之中,存在則返回匹配起始位置的下標,不存在則返回-1。感受和字符串的indexOf的內容很像。
-- buf.keys()這一函數的做用是建立一個包含buf索引的迭代器。
-- buf.lastIndexOf():這一函數傳遞的參數內容與indexOf相同,做用也是相似,只是其返回的再也不是陪陪的第一個字符串的位置了,而是最後一段匹配的字符串的位置。
固然還有其餘的一些經常使用或是很是用的Buffer對象的方法,這裏就不一一介紹了。能夠閱讀相關的文檔內容。