NIO有兩種方式創建緩衝區:分配、包裝
我們以CharBuffer爲例進行說明:
一、分配方式:allocate
下面是java6對CharBuffer的allocate的定義:
public static CharBuffer allocate(int capacity)分配新的字符緩衝區。
新緩衝區的位置將爲零,其界限將爲其容量,其標記是未定義的。它將具有一個底層實現數組,且其數組偏移量將爲零。
參數:
capacity - 新緩衝區的容量,以字符爲單位
返回:
新的字符緩衝區
拋出:
IllegalArgumentException - 如果 capacity 爲負整數
例:
CharBuffer charBuffer=CharBuffer.allocate(100);分配一個容量爲100個char變量的CharBuffer
二、包裝方式:wrap
包裝操作創建一個緩衝區對象但是不分配任何空間存儲數據元素。它使用您所提供的數組作爲存儲空間來存儲緩衝區中的數據元素
下面是java6對CharBuffer的wrap的定義:
public static CharBuffer wrap(char[] array)將字符數組包裝到緩衝區中。
給定的字符數組將支持新緩衝區;即緩衝區修改將導致數組修改,反之亦然。
新緩衝區的容量和界限將爲 array.length,其位置將爲零,其標記是未定義的。其底層實現數組將爲給定數組,並且其數組偏移量將爲零。
參數:
array - 實現此緩衝區的數組
返回:
新的字符緩衝區
public static CharBuffer wrap(char[] array,
int offset,
int length)將字符數組包裝到緩衝區中。
給定的字符數組將支持新緩衝區;即緩衝區修改將導致數組修改,反之亦然。
新緩衝區的容量將爲 array.length,其位置將爲 offset,其界限將爲 offset + length,其標記是未定義的。其底層實現數組將爲給定數組,並且其數組偏移量將爲零。
參數:
array - 支持新緩衝區的數組
offset - 要使用的子數組的偏移量;必須爲非負且不大於 array.length。將新緩衝區的位置設置爲此值。
length - 要使用的子數組的長度;必須爲非負且不大於 array.length - offset。新緩衝區的界限將被設置爲 offset + length。
返回:
新的字符緩衝區
拋出:
IndexOutOfBoundsException - 如果關於 offset 和 length 參數的前提不成立
其餘兩個wrap方法我們在這裏先不介紹,在今後的章節會進行介紹
例:
Char[] myArray=new Char[100];
CharBuffer charBuffer=CharBuffer.wrap(myArray);
以上對象構造了一個新的緩衝區對象,但是數據元素會存儲在數組中。
CharBuffer charBuffer=CharBuffer.wrap(myArray,12,42);
創建了一個position=12,limit=54,容量爲myArray.length的緩衝區對象
通過allocate和wrap創建的緩衝區通常是間接的。間接的緩衝區使用備份數組。
hasArray()會告訴我們緩衝區是否有一個可存取的備份數組,如果返回爲true,array()函數會返回這個緩衝區使用的數組存儲空間的引用。
如果返回false,調用array或者arrayOffset會產生UnsuppootedOperationException異常。
如果一個緩衝區是只讀的,調用arra或者arrayOffset會返回ReadOnlyException異常來阻止獲得存取權限來修改緩衝區中的內容。
下面是java6幫助文檔中的hasArray方法的說明:
public final boolean hasArray()判斷該緩衝區是否可通過一個可訪問的字符數組實現。
如果此方法返回 true,則可以安全地調用 array 和 arrayOffset 方法。
指定者:
類 Buffer 中的 hasArray
返回:
當且僅當存在實現此緩衝區的數組,並且此緩衝區不是隻讀緩衝區時,返回 true
public final char[] array()返回實現此緩衝區的字符數組(可選操作)。
此緩衝區的內容修改將導致返回的數組內容修改,反之亦然。
調用此方法之前要調用 hasArray 方法,以確保此緩衝區具有可訪問的底層實現數組。
指定者:
類 Buffer 中的 array
返回:
實現此緩衝區的數組
拋出:
ReadOnlyBufferException - 如果存在實現此緩衝區的數組,但緩衝區是隻讀的
UnsupportedOperationException - 如果不存在某個可訪問的數組實現此緩衝區
public final int arrayOffset()返回此緩衝區中的第一個元素在緩衝區的底層實現數組中的偏移量(可選操作)。
如果存在實現此緩衝區的數組,則緩衝區位置 p 對應於數組索引 p + arrayOffset()。
調用此方法之前要調用 hasArray 方法,以確保此緩衝區具有可訪問的底層實現數組。
指定者:
類 Buffer 中的 arrayOffset
返回:
此緩衝區的第一個元素在緩衝區數組中的偏移量
拋出:
ReadOnlyBufferException - 如果存在實現此緩衝區的數組,但緩衝區是隻讀的
UnsupportedOperationException - 如果不存在某個可訪問的數組實現此緩衝區