深刻淺出node.js學習筆記-Buffer對象

Buffer在node運行時自動加載,掛載到global對象上,因此使用不須要require
Buffer是一個相似Array的對象,但它主要操做字節。
Buffer所佔內存不經過V8分配,屬於堆外內存
Buffer相似於數組格式,內部元素是16進制的兩位數,即0~255
Utf-8狀況下,漢字佔3位,符號和字母佔一位node

可經過下角標訪問元素和賦值。c++

let buffer = new Buffer(100)
buffer[10] = -100 // 156 若是賦值比0小,則加上256
buffer[20] = 300 // 44 若是賦值比255大,則減去256
buffer[30] = 3.1415 // 3 小數則捨棄小數部分,保留整數
console.log(buffer[1]) //會打印一個0到255的隨機值

Buffer內存分配不經過v8,是由於Buffer的性能相關部分是經過C++實現的,因此它的內存是經過c++層面實現的。
Buffer內存分配時,以8kb爲界限數組

  • 小於8kb的爲小Buffer:對於小Buffer對象,採用slab分配機制,c++先申請8kb的slab內存,若是該slab剩餘空間足夠,則在slab空間內分配內存給新的Buffer,若是不足,則申請新的slab空間。
  • 大於8kb的爲大Buffer:大Buffer對象,將會直接分配一個SlowBuffer對象做爲slab空間,該slab空間被大Buffer對象獨佔。

Buffer能夠與字符串直接進行轉換,支持如下格式性能

  • UTF-8
  • ACSII
  • UTF-16LE/UCS-2
  • Base64
  • Hex
  • Binary

Buffer對象儘可能不要使用+運算符進行拼接,以下代碼ui

const fs = require(‘fs’)
let rs = fs.createReadStream(’test.txt’)
let data = ‘'
rs.on(‘data’, function(chunk) {
    data += chunk
})
rs.on(‘end’, function() {
    console.log(data)
})

data += chunk這句話蘊含了toString()轉換,等價於data = data.toString() + chunk.toString()
chunk爲Buffer對象,如何內部含義寬字節編碼,toString()就會致使亂碼。編碼

相關文章
相關標籤/搜索