什么是Buffer
java.nio.Buffer
抽象類指的是用于存儲(chǔ)特定原始類型數(shù)據(jù)的容器驶乾,Buffer
除了它存放的數(shù)據(jù)之外還有四個(gè)基本屬性:position
、limit
探熔、capacity
、mark
這幾個(gè)值都是int
類型 ,它們之間滿足如下數(shù)學(xué)關(guān)系:
0 <= mark <= position <= limit<= capacity
這四個(gè)特征的含義如下:
-
capacity
可以存放數(shù)據(jù)項(xiàng)的總大小 -
limit
不應(yīng)該讀取或?qū)懭氲牡谝粋€(gè)元素的索引 -
position
下一個(gè)要讀或?qū)懙脑氐乃饕?/li> -
mark
標(biāo)記位
標(biāo)記和重置
通過(guò)reset可以將position設(shè)置為mark的值
Clear, flipp, and rewind
-
clear()
當(dāng)需要填充Buffer時(shí)調(diào)用,比如channel讀取數(shù)據(jù)到緩存區(qū)或者使用put操作向緩存區(qū)放數(shù)據(jù)市怎,它會(huì)把limit設(shè)置為capacity,同時(shí)將position置為零 -
flip()
當(dāng)需要消耗Buffer時(shí)調(diào)用,比如把緩存區(qū)數(shù)據(jù)寫(xiě)入到channel或者使用get操作獲取緩沖區(qū)數(shù)據(jù)蕴侣,它會(huì)把limit設(shè)置為position,同時(shí)將position置為零 -
rewind()
當(dāng)需要重新讀取緩沖區(qū)數(shù)據(jù)時(shí)調(diào)用,它不會(huì)把改變limit的值,會(huì)將position置為零
除了boolean類型臭觉,每個(gè)基本數(shù)據(jù)類型都有其對(duì)應(yīng)的Buffer類
直接緩沖區(qū)與非直接緩沖區(qū)
緩沖區(qū)分為是直接緩沖區(qū)和非直接緩沖區(qū)昆雀。如果是直接字節(jié)緩沖區(qū),Java虛擬機(jī)將盡力直接在其上執(zhí)行本地I/O操作蝠筑,避免使用中間臨時(shí)緩存區(qū)進(jìn)行多次拷貝
直接緩存區(qū)分配和回收的開(kāi)銷更大
建議將直接緩沖區(qū)主要分配給大型狞膘、長(zhǎng)時(shí)間運(yùn)行IO程序
線程安全
Buffer不是線程安全的
如何創(chuàng)建Buffer
以ByteBuffer
為例子,如下所示是創(chuàng)建ByteBuffer
的幾種方式:
-
ByteBuffer allocate(int capacity)
使用指定的capacity創(chuàng)建一個(gè)新的非直接ByteBuffer,內(nèi)存分配在heap上 -
ByteBuffer allocateDirect(int capacity)
使用指定的capacity創(chuàng)建一個(gè)新直接ByteBuffer -
ByteBuffer wrap(byte[] array)
字節(jié)數(shù)組包裝到緩沖區(qū)中什乙。新的緩沖區(qū)由數(shù)組支持;也就是說(shuō)挽封,對(duì)緩沖區(qū)的修改將導(dǎo)致數(shù)組被修改,反之亦然臣镣。新緩沖區(qū)的capacity和limit設(shè)置為array.length辅愿,它的position被設(shè)置為0智亮,它的mark是未定義的 -
ByteBuffer wrap(byte[] array, int offset, int length)
字節(jié)數(shù)組包裝到緩沖區(qū)中。新的緩沖區(qū)由數(shù)組支持;也就是說(shuō)点待,對(duì)緩沖區(qū)的修改將導(dǎo)致數(shù)組被修改阔蛉,反之亦然。新緩沖區(qū)的capacity設(shè)置為array.length癞埠,limit設(shè)置為offset+length,它的position被設(shè)置為offset状原,它的mark是未定義的
buffer 視圖
ByteBuffer buffer = ByteBuffer.allocate(10);
ByteBuffer bufferView = buffer.duplicate();
ByteBuffer’s asxBuffer()
Buffer 讀寫(xiě)
put/get 帶有index的為絕對(duì)操作,不帶index的為相對(duì)操作