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