java NIO(五) 緩衝區——創建緩衝區


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 - 如果不存在某個可訪問的數組實現此緩衝區



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章