能夠在TCP流或者文件系統操做等場景中處理二進制數據流。javascript
Buffer實例相似於整數數組,可是Buffer大小固定、且在V8堆外分配物理內存,Buffer的大小在建立時肯定,沒法調整。java
Buffer
類方法注意:(如下方法Node新版本中已被廢棄,不建議使用)數組
不建議使用的有以下:newBuffer(array)
、newBuffer(arrayBuffer)
、newBuffer(buffer)
、newBuffer(size)
、newBuffer(string)
。安全
替代方法有以下:Buffer.from()
、Buffer.alloc()
、Buffer.allocUnsafe()
。函數
Buffer.from(array)
返回一個新建的包含所提供的字節數組的副本的Buffer。let buf1 = Buffer.from([1,2,3,4]) // <Buffer 01 02 03 04> let buf2 = Buffer.from([[0x62, 0x75, 0x66, 0x66, 0x65, 0x72]]) // <Buffer 62 75 66 66 65 72> buf2.toString() // 'buffer'
Buffer.from(arrayBuffer[,byteOffset[,length]])
返回一個新建的與給定的ArrayBuffer共享同一內存的Buffer。const arr = new Unit16Array(2) const buf = Buffer.from(arr.buffer) // 改動arr也會影響到buf
Buffer.from(buffer)
返回一個新建的包含所提供的Buffer的內容的副本的Buffer。let buf1 = Buffer.from('buffer') let buf2 = Buffer.from(buf1) buf1[0] = 0x61 console.log(buf1) // auffer console.log(buf2) // buffer
Buffer.from(string[,encoding])
返回一個新建的包含所提供的字符串的副本的Buffer。Buffer.alloc(size[,fill[,encoding]])
返回一個指定大小的被填滿的Buffer實例。這個方法會明顯地比Buffer.allocUnsafe(size)
慢,但可確保新建立的Buffer實例毫不會包含舊的和潛在的敏感數據。// size: 新建的Buffer指望的長度 // fill:<string | Buffer | integer>用來預填充新建的Buffer的值,默認:0 // encoding:若是fill是字符串,那麼這個就是字符編碼,默認:utf-8 const buf = Buffer.alloc(5) // <Buffer 00 00 00 00 00> const buf = Buffer.alloc(5, 'a') // <Buffer 61 61 61 61 61> const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64') // 輸出: <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64> hello world
Buffer.allocUnsafe(size)
與Buffer.allocUnsafeSlow(size)
返回一個新建的指定size的Buffer,但它的內容必須被初始化,可使用buf.fill(0)
或徹底寫滿。開發者應該把全部正在使用的newBuffer()
構造函數遷移到新的API上。性能
Buffer.allocUnsafe()
和Buffer.allocUnsafeSlow()
不安全?是由於調用這兩個方法時,被分配的內存都是未被初始化的(未被0填充),雖然這樣的設計使得內存的分配很是快(性能優點),可是已經分配的內存段可能包含潛在的敏感舊數據。使用經過Buffer.allocUnsafe()
建立的沒有被徹底重寫內存的Buffer,在Buffer內存可讀的狀況下,有可能泄露它的舊數據。編碼
Buffer
與字符編碼經過指定的編碼進制,能夠在Buffer與普通的字符串之間轉換。目前支持的ascii
,utf-8
,base-64
,binary
,hex
prototype
const buf = Buffer.from('helloworld', 'ascii') buf.toString('hex') buf.toString('base64')
Buffer
與ES6
迭代器一樣,Buffer實例可使用迭代器for...of進行遍歷,遍歷器的buf.values()
、buf.keys(
)、buf.entries()
能夠用於建立迭代器。設計
const buf = Buffer.from([1, 2, 3]) for(let b of buf){ console.log(b) // 1 2 3 }
Buffer.byteLength(string[, encoding])
返回一個字符串的實際字節長度。String.prototype.length
是返回字符串的字符數。注意字符數和字節長度是不一樣,英文字母中是相同的,可是當有中文時或者unicode編碼(它是用兩個字節來編碼一個字符)是不一樣的。code
'中文hello'.length // 7 Buffer.byteLength('中文hello', 'uft-8') // 11
Buffer.compare(buf1, buf2)
一般用於Buffer實例數組的排序。(有點像sort()
方法)Buffer.concat(list[, totalLength])
合併Bufferconst buf1 = Buffer.alloc(10) const buf2 = Buffer.alloc(14) const buf3 = Buffer.alloc(18) const totalLength = buf1.length + buf2.length + buf3.length // 42 const bufA = Buffer.concat([buf1, buf2, buf3], 41) // 截斷爲totalLength的長度,缺乏的部分會用00補充 cosnole.log(buf.length) // 41
Buffer.isBuffer(obj)
,是一個buffer返回trueBuffer.isEncoding(encoding)
,是一個支持的字符編碼返回trueBuffer.entries()
,建立並返回一個[index, byte]形式的迭代器cosnt buf = Buffer.from('buffer') for(let pair of buf.entries()) { console.log(pair) // [0, 98],[1, 117]... }
buf.equals(otherBuffer)
,若是buf與otherBuffer具備徹底相同的字節就返回true