一、ByteBuffer的創建
ByteBuffer創建緩存區常用的有兩種方式:
1、使用allocate直接創建指定大小的空緩存區
ByteBuffer buffer=ByteBuffer.allocate(64);
position: 0 limit: 64 capacity 64
2、使用wrap創建一個具有內容的緩存區
ByteBuffer b2=ByteBuffer.wrap("12345678".getBytes());
position: 0 limit: 8 capacity 8
二、將數據存放如緩存區
ByteBuffer存放數據方法爲put(),存放數據position會進行遞增操作,position最大爲capacity。超出大小將拋出異常
三、從緩存區讀取數據
get(),讀取內容爲position與limit之間的內容,每次讀取position將回進行遞增操作。超出大小將拋出異常
注意:
clear:
清除此緩衝區。將位置設置爲 0,將限制設置爲容量,並丟棄標記
此方法不能實際清除緩衝區中的數據,但從名稱來看它似乎能夠這樣做,這樣命名是因爲它多數情況下確實是在清除數據時使用
使用clear方法只是將buffer的幾個標識位重置,並沒有將緩存中的數據清除,在使用中千萬注意
flip:
首先將限制設置爲當前位置,然後將位置設置爲 0。如果已定義了標記,則丟棄該標記
flip方法是將position位置設定爲limit位置,將position設置爲0
remaining:
返回當前位置與限制之間的元素數
compact:
將緩衝區的當前位置和界限之間的字節(如果有)複製到緩衝區的開始處。即將索引 p = position() 處的字節複製到索引 0 處,將索引 p + 1 處的字節複製到索引 1 處,依此類推,直到將索引 limit() - 1 處的字節複製到索引 n = limit() - 1 - p 處。然後將緩衝區的位置設置爲 n+1,並將其界限設置爲其容量。如果已定義了標記,則丟棄它
compact方法就是將position與limit之間的數據移動到0到limit() - 1 - p處,將position設置爲後面可用位置,limit設置爲初始大小
將緩衝區的位置設置爲複製的字節數,而不是零,以便調用此方法後可以緊接着調用另一個相對 put 方法。
從緩衝區寫入數據之後調用此方法,以防寫入不完整。例如,以下循環語句通過 buf 緩衝區將字節從一個信道複製到另一個信道:
buf.clear(); // Prepare buffer for use while (in.read(buf) >= 0 || buf.position != 0) { buf.flip(); out.write(buf); buf.compact(); // In case of partial write }