JavaTM 2 Platform
Standard Ed. 6

java.nio
類別 Buffer

java.lang.Object
  繼承者 java.nio.Buffer
直接已知子類別:
ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer

public abstract class Buffer
extends Object

一個用於特定基本型別資料的容器。

緩衝區是特定基本型別元素的線性有限序列。除內容外,緩衝區的基本屬性還包括容量、限制和位置:

緩衝區的容量 是它所包含的元素的數量。緩衝區的容量不能為負並且不能更改。

緩衝區的限制 是第一個不應該讀取或寫入的元素的索引。緩衝區的限制不能為負,並且不能大於其容量。

緩衝區的位置 是下一個要讀取或寫入的元素的索引。緩衝區的位置不能為負,並且不能大於其限制。

對於每個非 boolean 基本型別,此類別都有一個子類別與之對應。

傳輸資料

此類別的每個子類別都定義了兩種獲取放置 操作:

相對 操作讀取或寫入一個或多個元素,它從當前位置開始,然後將位置增加所傳輸的元素數。如果請求的傳輸超出限制,則相對獲取 操作將拋出 BufferUnderflowException,相對放置 操作將拋出 BufferOverflowException;這兩種情況下,都沒有資料被傳輸。

絕對 操作採用顯式元素索引,該操作不影響位置。如果索引參數超出限制,絕對獲取 操作和放置 操作將拋出 IndexOutOfBoundsException

當然,通過適當通道的 I/O 操作(通常與當前位置有關)也可以將資料傳輸到緩衝區或從緩衝區傳出資料。

做標記和重置

緩衝區的標記 是一個索引,在調用 reset 方法時會將緩衝區的位置重置為該索引。並非總是需要定義標記,但在定義標記時,不能將其定義為負數,並且不能讓它大於位置。如果定義了標記,則在將位置或限制調整為小於該標記的值時,該標記將被丟棄。如果未定義標記,那麼調用 reset 方法將導致拋出 InvalidMarkException

不變式

標記、位置、限制和容量值遵守以下不變式:

0 <= 標記 <= 位置 <= 限制 <= 容量

新創建的緩衝區總有一個 0 位置和一個未定義的標記。初始限制可以為 0,也可以為其他值,這取決於緩衝區型別及其建構方式。一般情況下,緩衝區的初始內容是未定義的。

清除、反轉和重繞

除了存取位置、限制、容量值的方法以及做標記和重置的方法外,此類別還定義了以下可對緩衝區進行的操作:

只讀緩衝區

每個緩衝區都是可讀取的,但並非每個緩衝區都是可寫入的。每個緩衝區類別的轉變方法都被指定為可選操作,當對只讀緩衝區調用時,將拋出 ReadOnlyBufferException。只讀緩衝區不允許更改其內容,但其標記、位置和限制值是可變的。可以調用其 isReadOnly 方法確定緩衝區是否為只讀。

執行緒安全

多個當前執行緒使用緩衝區是不安全的。如果一個緩衝區由不止一個執行緒使用,則應該通過適當的同步來控制對該緩衝區的存取。

調用鏈

指定此類別中的方法返回調用它們的緩衝區(否則它們不會返回任何值)。此操作允許將方法調用組成一個鏈;例如,語句序列

 b.flip();
 b.position(23);
 b.limit(42);
可以由以下更緊湊的一個語句代替
 b.flip().position(23).limit(42);

從以下版本開始:
1.4

方法摘要
abstract  Object array()
          返回此緩衝區的底層實作陣列(可選操作)
abstract  int arrayOffset()
          返回此緩衝區的底層實作陣列中第一個緩衝區元素的偏移量(可選操作)
 int capacity()
          返回此緩衝區的容量。
 Buffer clear()
          清除此緩衝區。
 Buffer flip()
          反轉此緩衝區。
abstract  boolean hasArray()
          告知此緩衝區是否具有可存取的底層實作陣列。
 boolean hasRemaining()
          告知在當前位置和限制之間是否有元素。
abstract  boolean isDirect()
          告知此緩衝區是否為直接緩衝區
abstract  boolean isReadOnly()
          告知此緩衝區是否為只讀緩衝區。
 int limit()
          返回此緩衝區的限制。
 Buffer limit(int newLimit)
          設置此緩衝區的限制。
 Buffer mark()
          在此緩衝區的位置設置標記。
 int position()
          返回此緩衝區的位置。
 Buffer position(int newPosition)
          設置此緩衝區的位置。
 int remaining()
          返回當前位置與限制之間的元素數。
 Buffer reset()
          將此緩衝區的位置重置為以前標記的位置。
 Buffer rewind()
          重繞此緩衝區。
 
從類別 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

方法詳細資訊

capacity

public final int capacity()
返回此緩衝區的容量。

返回:
此緩衝區的容量

position

public final int position()
返回此緩衝區的位置。

返回:
此緩衝區的位置

position

public final Buffer position(int newPosition)
設置此緩衝區的位置。如果標記已定義且大於新的位置,則丟棄該標記。

參數:
newPosition - 新位置值;必須為非負且不大於當前限制
返回:
此緩衝區
拋出:
IllegalArgumentException - 如果 newPosition 不滿足先決條件

limit

public final int limit()
返回此緩衝區的限制。

返回:
此緩衝區的限制

limit

public final Buffer limit(int newLimit)
設置此緩衝區的限制。如果位置大於新的限制,則將它設置為新限制。如果標記已定義且大於新限制,則丟棄該標記。

參數:
newLimit - 新限制值;必須為非負且不大於此緩衝區的容量
返回:
此緩衝區
拋出:
IllegalArgumentException - 如果 newLimit 不滿足先決條件

mark

public final Buffer mark()
在此緩衝區的位置設置標記。

返回:
此緩衝區

reset

public final Buffer reset()
將此緩衝區的位置重置為以前標記的位置。

調用此方法不更改也不丟棄標記的值。

返回:
此緩衝區
拋出:
InvalidMarkException - 如果尚未設置標記

clear

public final Buffer clear()
清除此緩衝區。將位置設置為 0,將限制設置為容量,並丟棄標記。

在使用一系列通道讀取或放置 操作填充此緩衝區之前調用此方法。例如:

 buf.clear();     // Prepare buffer for reading
 in.read(buf);    // Read data

此方法不能實際清除緩衝區中的資料,但從名稱來看它似乎能夠這樣做,這樣命名是因為它多數情況下確實是在清除資料時使用。

返回:
此緩衝區

flip

public final Buffer flip()
反轉此緩衝區。首先將限制設置為當前位置,然後將位置設置為 0。如果已定義了標記,則丟棄該標記。

在一系列通道讀取或放置 操作之後,調用此方法為一系列通道寫入或相對獲取 操作做好準備。例如:

 buf.put(magic);    // Prepend header
 in.read(buf);      // Read data into rest of buffer
 buf.flip();        // Flip buffer
 out.write(buf);    // Write header + data to channel

當將資料從一個地方傳輸到另一個地方時,經常將此方法與 compact 方法一起使用。

返回:
此緩衝區

rewind

public final Buffer rewind()
重繞此緩衝區。將位置設置為 0 並丟棄標記。

在一系列通道寫入或獲取 操作之前調用此方法(假定已經適當設置了限制)。例如:

 out.write(buf);    // Write remaining data
 buf.rewind();      // Rewind buffer
 buf.get(array);    // Copy data into array

返回:
此緩衝區

remaining

public final int remaining()
返回當前位置與限制之間的元素數。

返回:
此緩衝區中的剩餘元素數

hasRemaining

public final boolean hasRemaining()
告知在當前位置和限制之間是否有元素。

返回:
當且僅當此緩衝區中至少還有一個元素時返回 true

isReadOnly

public abstract boolean isReadOnly()
告知此緩衝區是否為只讀緩衝區。

返回:
當且僅當此緩衝區為只讀緩衝區時返回 true

hasArray

public abstract boolean hasArray()
告知此緩衝區是否具有可存取的底層實作陣列。

如果此方法返回 true,則可以安全地調用 arrayarrayOffset 方法。

返回:
當且僅當此緩衝區有非只讀的底層實作陣列時返回 true
從以下版本開始:
1.6

array

public abstract Object array()
返回此緩衝區的底層實作陣列(可選操作)

此方法旨在使具有底層實作陣列的緩衝區能更有效地傳遞給本機程式碼。具體子類別為此方法提供更強型別的返回值。

對此緩衝區內容進行修改將導致返回陣列的內容被修改,反之亦然。

調用此方法前應調用 hasArray 方法,以確保此緩衝區存在可存取的底層實作陣列。

返回:
此緩衝區的底層實作陣列
拋出:
ReadOnlyBufferException - 如果此緩衝區存在底層實作陣列,但它是只讀的
UnsupportedOperationException - 如果此緩衝區不存在可存取的底層實作陣列
從以下版本開始:
1.6

arrayOffset

public abstract int arrayOffset()
返回此緩衝區的底層實作陣列中第一個緩衝區元素的偏移量(可選操作)

如果此緩衝區存在底層實作陣列,那麼緩衝區位置 p 對應於陣列索引 p + arrayOffset()

調用此方法前應調用 hasArray 方法,以確保此緩衝區存在可存取的底層實作陣列。

返回:
此緩衝區陣列中第一個緩衝區元素的偏移量
拋出:
ReadOnlyBufferException - 如果此緩衝區存在底層實作陣列,但它是只讀的
UnsupportedOperationException - 如果此緩衝區不存在可存取的底層實作陣列
從以下版本開始:
1.6

isDirect

public abstract boolean isDirect()
告知此緩衝區是否為直接緩衝區

返回:
當且僅當此緩衝區為直接緩衝區時返回 true
從以下版本開始:
1.6

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only