Buffer是固定大小的數據的容器,其做用是一個存儲器,或者分段運輸區,在這裏數據可被存儲並在以後用於檢索。緩衝區的工做與通道緊密聯繫,待傳遞出去的數據被置於一個緩衝區,被傳送到通道;待傳回的緩衝區的傳輸,一個通道將數據放置在所提供的緩衝區中。這種在協同對象之間進行的緩衝區數據傳遞是高效數據處理的關鍵。數組
下圖是Buffer類的層次圖。在頂部是通用Buffer類,Buffer定義全部緩衝區類型共有的操做,不管是它們所包含的數據類型仍是可能具備的特定行爲:函數
緩衝區是包在一個對象內的基本數據元素數組。Buffer類相比一個簡單數組的優勢是它將關於數據的數據內容和信息包含在一個單一的對象中,Buffer類以及它專有的子類定義了一個用於處理數據緩衝區的API。全部的緩衝區都具備四個屬性來提供關於其所包含的數據元素的信息:post
屬 性 | 做 用 |
---|---|
capacity | 容量,指緩衝區可以容納的數據元素的最大數量,這一容量在緩衝區建立時被設定,而且永遠不能被改變 |
limit | 上界,指緩衝區的第一個不能被讀或寫的元素,或者說是,緩衝區中現存元素的計數 |
position | 位置,指下一個要被讀或寫的元素的索引,位置會自動由相應的get()和put()函數更新 |
mark | 標記,指一個備忘位置,調用mark()來設定mark=position,調用reset()來設定postion=mark,標記未設定前是未定義的 |
下面簡單介紹幾個經常使用方法調用後,屬性的變化。開闢一個起始容量爲10的緩衝區:spa
put() 方法對象
flip() 方法,將Buffer從寫模式切換到讀模式blog
image.png索引
rewind()方法,將position設回0,limit保持不變,用於重讀Buffer中的全部數據ip
Buffer讀寫模式下屬性的變化ci
最後以一段代碼,簡單介紹如下Buffer的使用字符串
public class TestMain { /** * 待顯示的字符串 */ private static String[] strs = { "Hello World" }; /** * 標識strs的下標索引 */ private static int index = 0; /** * 向Buffer內放置數據 */ private static boolean fillBuffer(CharBuffer buffer) { if (index >= strs.length) return false; String str = strs[index++]; for (int i = 0; i < str.length(); i++) { buffer.put(str.charAt(i)); } return true; } /** * 從Buffer內把數據拿出來 */ private static void drainBuffer(CharBuffer buffer) { while (buffer.hasRemaining()) { System.out.print(buffer.get()); } System.out.println(""); } public static void main(String[] args) { CharBuffer cb = CharBuffer.allocate(100); while (fillBuffer(cb)) { cb.flip(); drainBuffer(cb); cb.clear(); } } }