Javascript在客戶端對于unicode編碼的數(shù)據(jù)操作支持非常友好,但是對二進(jìn)制數(shù)據(jù)的處理就不盡人意。Node.js為了能夠處理二進(jìn)制數(shù)據(jù)或非unicode編碼的數(shù)據(jù),便設(shè)計(jì)了Buffer類,該類實(shí)現(xiàn)了Uint8Array接口,并對其進(jìn)行了優(yōu)化,它的實(shí)例類似于整型數(shù)組,但是它的大小在創(chuàng)建后便不可調(diào)整。在介紹Buffer如何使用之前,先介紹幾個(gè)知識(shí)點(diǎn)。
1、V8引擎的內(nèi)存使用限制
V8引擎最大堆內(nèi)存使用在32位系統(tǒng)上默認(rèn)為512M,在64位系統(tǒng)上是1GB,雖然可以使用--max-old-space-size
參數(shù)調(diào)整該值,但還是建議要用到大內(nèi)存的時(shí)候使用Buffer或Stream,因?yàn)锽uffer的內(nèi)存分配不在V8的堆上。
2、單個(gè)Buffer實(shí)例大小限制
單個(gè)Buffer實(shí)例的大小最大數(shù)值為1GB-1(32位系統(tǒng))或2GB-1(64位系統(tǒng)),所以在創(chuàng)建Buffer實(shí)例的時(shí)候不能超過該值,或者使用readFile()
方法讀取大文件,否則將拋出RangeError錯(cuò)誤。
3、8KB池
Nodejs在創(chuàng)建Buffer實(shí)例的時(shí)候,當(dāng)用戶申請的空間大于8KB,會(huì)直接調(diào)用內(nèi)部的createUnsafeBuffer()
方法創(chuàng)建一個(gè)Buffer,如果申請的空間大于0且小于4KB,新的Buffer則會(huì)建立在當(dāng)前的8kb SLAB上,并更新剩余空間,如下圖所示:
下面介紹Buffer API的簡單使用:
1、創(chuàng)建Buffer實(shí)例
使用Buffer.from(), Buffer.alloc(), Buffer.allocUnsafe()
等方法來創(chuàng)建一個(gè)Buffer實(shí)例,6.0版本以前直接使用構(gòu)造函數(shù)創(chuàng)建的方法
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式