NodeAPI學習之Buffer

Buffer

能夠在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與普通的字符串之間轉換。目前支持的asciiutf-8base-64binaryhexprototype

const buf = Buffer.from('helloworld', 'ascii')
buf.toString('hex')
buf.toString('base64')

BufferES6迭代器

一樣,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])合併Buffer
const 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返回true
  • Buffer.isEncoding(encoding),是一個支持的字符編碼返回true
  • Buffer.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
相關文章
相關標籤/搜索