Java NIO之Buffer
Buffer類的層次圖
下圖是Buffer類的層次圖。在頂部是通用Buffer類,Buffer定義所有緩沖區類型共有的操作,無論是它們所包含的數據類型還是可能具有的特定行為:
Buffer的屬性
緩沖區是包在一個對象內的基本數據元素數組。Buffer類相比一個簡單數組的優點是它將關於數據的數據內容和信息包含在一個單一的對象中,Buffer類以及它專有的子類定義了一個用於處理數據緩沖區的API。所有的緩沖區都具有四個屬性來提供關於其所包含的數據元素的信息:
屬 性 作 用
capacity 容量,指緩沖區能夠容納的數據元素的最大數量,這一容量在緩沖區創建時被設定,並且永遠不能被改變
limit 上界,指緩沖區的第一個不能被讀或寫的元素,或者說是,緩沖區中現存元素的計數
position 位置,指下一個要被讀或寫的元素的索引,位置會自動由相應的get()和put()函數更新
mark 標記,指一個備忘位置,調用mark()來設定mark=position,調用reset()來設定postion=mark,標記未設定前是未定義的
下面簡單介紹幾個常用方法調用後,屬性的變化。開辟一個起始容量為10的緩沖區:
put() 方法
flip() 方法,將Buffer從寫模式切換到讀模式
image.png
rewind()方法,將position設回0,limit保持不變,用於重讀Buffer中的所有數據
Buffer讀寫模式下屬性的變化
Buffer的使用
最後以一段代碼,簡單介紹以下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();
}
}
}
-
Java NIO之Buffer