ByteBuffer詳解

Bytebuffer
官方解釋A byte buffer,一個字節(jié)緩沖區(qū)。

ByteBuffer的擴展

HeapByteBuffer 和 DirectByteBuffer


Bytebuffer UML圖
- 描述 優(yōu)點
HeapByteBuffer 在jvm堆上面的一個buffer,底層的本質(zhì)是一個數(shù)組 由于內(nèi)容維護在jvm里,所以把內(nèi)容寫進buffer里速度會快些;并且,可以更容易回收
DirectByteBuffer 底層的數(shù)據(jù)其實是維護在操作系統(tǒng)的內(nèi)存中,而不是jvm里,DirectByteBuffer里維護了一個引用address指向了數(shù)據(jù),從而操作數(shù)據(jù) 跟外設(shè)(IO設(shè)備)打交道時會快很多,因為外設(shè)讀取jvm堆里的數(shù)據(jù)時,不是直接讀取的,而是把jvm里的數(shù)據(jù)讀到一個內(nèi)存塊里,再在這個塊里讀取的,如果使用DirectByteBuffer,則可以省去這一步,實現(xiàn)zero copy

ByteBuffer的屬性及方法

ByteBuffer的屬性
     byte[] buff  //buff即內(nèi)部用于緩存的數(shù)組。
     position //當(dāng)前讀取的位置。
     mark //為某一讀過的位置做標(biāo)記,便于某些時候回退到該位置。
     capacity //初始化時候的容量。
     limit //當(dāng)寫數(shù)據(jù)到buffer中時,limit一般和capacity相等,當(dāng)讀數(shù)據(jù)時,limit代表buffer中有效數(shù)據(jù)的長度。

這些屬性總是滿足以下條件:
  0 <= mark <= position <= limit <= capacity

ByteBuffer的常規(guī)方法
     ByteBuffer allocate(int capacity) //創(chuàng)建一個指定capacity的ByteBuffer。
     ByteBuffer allocateDirect(int capacity) //創(chuàng)建一個direct的ByteBuffer,這樣的ByteBuffer在參與IO操作時性能會更好
     ByteBuffer wrap(byte [] array)
     ByteBuffer wrap(byte [] array, int offset, int length) //把一個byte數(shù)組或byte數(shù)組的一部分包裝成ByteBuffer。
     //get put方法不多說
     byte get(int index)
     ByteBuffer put(byte b)
     int getInt()             //從ByteBuffer中讀出一個int值。
     ByteBuffer putInt(int value)  // 寫入一個int值到ByteBuffer中。
ByteBuffer的特殊方法
     Buffer clear()    把position設(shè)為0,把limit設(shè)為capacity,一般在把數(shù)據(jù)寫入Buffer前調(diào)用。
     Buffer flip()    把limit設(shè)為當(dāng)前position,把position設(shè)為0,一般在從Buffer讀出數(shù)據(jù)前調(diào)用。
     Buffer rewind()  把position設(shè)為0,limit不變,一般在把數(shù)據(jù)重寫入Buffer前調(diào)用。
     compact()       將 position 與 limit之間的數(shù)據(jù)復(fù)制到buffer的開始位置,復(fù)制后 position = limit -position,limit = capacity, 但如         果position 與limit 之間沒有數(shù)據(jù)的話發(fā),就不會進行復(fù)制。
     mark() & reset()     通過調(diào)用Buffer.mark()方法,可以標(biāo)記Buffer中的一個特定position。之后可以通過調(diào)用Buffer.reset()方法恢復(fù)到這個position。
圖解ByteBuffer方法改變屬性

put
寫模式下,往buffer里寫一個字節(jié),并把postion移動一位。寫模式下,一般limit與capacity相等。
flip
寫完數(shù)據(jù),需要開始讀的時候,將postion復(fù)位到0,并將limit設(shè)為當(dāng)前postion。
get
從buffer里讀一個字節(jié),并把postion移動一位。上限是limit,即寫入數(shù)據(jù)的最后位置。
clear
將position置為0,并不清除buffer內(nèi)容。
mark & reset
mark相關(guān)的方法主要是mark()(標(biāo)記)和reset()(回到標(biāo)記).

process
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容