Most visited

Recently visited

Added in API level 1

Buffer

public abstract class Buffer
extends Object

java.lang.Object
   ↳ java.nio.Buffer
Known Direct Subclasses
Known Indirect Subclasses


一个特定基元类型数据的容器。

缓冲区是特定基本类型的线性有限元素序列。 除了内容之外,缓冲区的基本属性是其容量,限制和位置:

缓冲区的容量是它包含的元素的数量。 缓冲区的容量永远不会消失,永远不会改变。

缓冲区的限制是不应读取或写入的第一个元素的索引。 缓冲区的限制永远不会是负面的,永远不会大于其容量。

缓冲区的位置是要读取或写入的下一个元素的索引。 缓冲区的位置永远不会是负值,永远不会超过其极限。

这个类的每个非布尔基元类型都有一个子类。

Transferring data

这个类的每个子类定义了两类 getput操作:

相对操作从当前位置开始读取或写入一个或多个元素,然后按传送的元素数量递增位置。 如果请求的传输超过限制,则相对获取操作将抛出BufferUnderflowException并且相对放置操作抛出BufferOverflowException ; 在任何情况下,都不会传输数据。

绝对操作采用明确的元素索引,不影响位置。 如果索引参数超出限制,则绝对getput操作会抛出IndexOutOfBoundsException

当然,数据也可以通过合适通道的I / O操作传送进或传出缓冲区,这些操作始终与当前位置相关。

Marking and resetting

缓冲区标志是调用reset方法时其位置将被重置的reset 标记并不总是被定义的,但是当它被定义时,它永远不会是负的,并且永远不会超过该位置。 如果标记被定义,那么当位置或极限值被调整到小于标记的值时,它将被丢弃。 如果标记未定义,则调用reset方法将导致引发InvalidMarkException

Invariants

以下不变量适用于标记,位置,限制和容量值:

0 <= mark <= position <= limit <= capacity

新创建的缓冲区总是有一个零位和一个未定义的标记。 初始限制可能为零,也可能是其他值,这取决于缓冲区的类型和构造方式。 新分配的缓冲区的每个元素都初始化为零。

Clearing, flipping, and rewinding

除了用于访问位置,限制和容量值以及用于标记和重置的方法之外,该类还定义了以下缓冲区操作:

Read-only buffers

每个缓冲区都是可读的,但不是每个缓冲区都是可写的。 每个缓冲区类的突变方法被指定为可选操作 ,当在只读缓冲区上调用时,该操作将抛出ReadOnlyBufferException 只读缓冲区不允许更改其内容,但其标记,位置和限制值是可变的。 缓冲区是否为只读可以通过调用其isReadOnly方法来确定。

Thread safety

缓冲区不适合多个并发线程使用。 如果多个线程使用缓冲区,则应该通过适当的同步来控制对缓冲区的访问。

Invocation chaining

指定此类中不具有返回值的方法以返回调用它们的缓冲区。 这允许方法调用被链接; 例如,语句的顺序

 b.flip();
 b.position(23);
 b.limit(42);
can be replaced by the single, more compact statement
 b.flip().position(23).limit(42);

Summary

Public methods

abstract Object array()

返回支持此缓冲区的数组 (可选操作)

abstract int arrayOffset()

返回缓冲区第一个元素 (可选操作)的此缓冲区的后备数组内的偏移量。

final int capacity()

返回此缓冲区的容量。

final Buffer clear()

清除此缓冲区。

final Buffer flip()

翻转此缓冲区。

abstract boolean hasArray()

告诉这个缓冲区是否由一个可访问的数组支持。

final boolean hasRemaining()

告诉当前位置和限制之间是否有任何元素。

abstract boolean isDirect()

判断这个缓冲区是否为 direct

abstract boolean isReadOnly()

告诉这个缓冲区是否是只读的。

final int limit()

返回此缓冲区的限制。

final Buffer limit(int newLimit)

设置此缓冲区的限制。

final Buffer mark()

将此缓冲区的标记设置在其位置。

final Buffer position(int newPosition)

设置此缓冲区的位置。

final int position()

返回此缓冲区的位置。

final int remaining()

返回当前位置和限制之间的元素数量。

final Buffer reset()

将此缓冲区的位置重置为之前标记的位置。

final Buffer rewind()

倒回这个缓冲区。

Inherited methods

From class java.lang.Object

Public methods

array

Added in API level 9
Object array ()

返回支持此缓冲区的数组 (可选操作)

此方法旨在允许将数组支持的缓冲区更有效地传递给本机代码。 具体子类为这种方法提供更强类型的返回值。

修改此缓冲区的内容将导致返回的数组内容被修改,反之亦然。

在调用此方法之前调用 hasArray方法,以确保此缓冲区具有可访问的后备阵列。

Returns
Object The array that backs this buffer
Throws
ReadOnlyBufferException If this buffer is backed by an array but is read-only
UnsupportedOperationException If this buffer is not backed by an accessible array

arrayOffset

Added in API level 9
int arrayOffset ()

返回缓冲区第一个元素 (可选操作)的此缓冲区的后备数组内的偏移量。

如果此缓冲区由数组支持,则缓冲区位置 p对应于数组索引 p + arrayOffset()

在调用此方法之前调用 hasArray方法,以确保此缓冲区具有可访问的后备阵列。

Returns
int The offset within this buffer's array of the first element of the buffer
Throws
ReadOnlyBufferException If this buffer is backed by an array but is read-only
UnsupportedOperationException If this buffer is not backed by an accessible array

capacity

Added in API level 1
int capacity ()

返回此缓冲区的容量。

Returns
int The capacity of this buffer

clear

Added in API level 1
Buffer clear ()

清除此缓冲区。 位置被设置为零,限制被设置为容量,并且标记被丢弃。

在使用通道读取或放置操作序列填充此缓冲区之前调用此方法。 例如:

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

这种方法实际上并不会擦除缓冲区中的数据,但它的名称就像它的名字一样,因为它最常用于那种情况下。

Returns
Buffer This buffer

flip

Added in API level 1
Buffer flip ()

翻转此缓冲区。 限制设置为当前位置,然后位置设置为零。 如果标记被定义,那么它被丢弃。

在一系列通道读取或放置操作之后,调用此方法来准备一系列通道写入或相对获取操作。 例如:

 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

This method is often used in conjunction with the compact method when transferring data from one place to another.

Returns
Buffer This buffer

hasArray

Added in API level 9
boolean hasArray ()

告诉这个缓冲区是否由一个可访问的数组支持。

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

Returns
boolean true if, and only if, this buffer is backed by an array and is not read-only

hasRemaining

Added in API level 1
boolean hasRemaining ()

告诉当前位置和限制之间是否有任何元素。

Returns
boolean true if, and only if, there is at least one element remaining in this buffer

isDirect

Added in API level 9
boolean isDirect ()

判断这个缓冲区是否为 direct

Returns
boolean true if, and only if, this buffer is direct

isReadOnly

Added in API level 1
boolean isReadOnly ()

告诉这个缓冲区是否是只读的。

Returns
boolean true if, and only if, this buffer is read-only

limit

Added in API level 1
int limit ()

返回此缓冲区的限制。

Returns
int The limit of this buffer

limit

Added in API level 1
Buffer limit (int newLimit)

设置此缓冲区的限制。 如果位置大于新的限制,则将其设置为新的限制。 如果标记被定义并且大于新的限制,那么它被丢弃。

Parameters
newLimit int: The new limit value; must be non-negative and no larger than this buffer's capacity
Returns
Buffer This buffer
Throws
IllegalArgumentException If the preconditions on newLimit do not hold

mark

Added in API level 1
Buffer mark ()

将此缓冲区的标记设置在其位置。

Returns
Buffer This buffer

position

Added in API level 1
Buffer position (int newPosition)

设置此缓冲区的位置。 如果标记被定义并且大于新位置,则将其丢弃。

Parameters
newPosition int: The new position value; must be non-negative and no larger than the current limit
Returns
Buffer This buffer
Throws
IllegalArgumentException If the preconditions on newPosition do not hold

position

Added in API level 1
int position ()

返回此缓冲区的位置。

Returns
int The position of this buffer

remaining

Added in API level 1
int remaining ()

返回当前位置和限制之间的元素数量。

Returns
int The number of elements remaining in this buffer

reset

Added in API level 1
Buffer reset ()

将此缓冲区的位置重置为之前标记的位置。

Invoking this method neither changes nor discards the mark's value.

Returns
Buffer This buffer
Throws
InvalidMarkException If the mark has not been set

rewind

Added in API level 1
Buffer rewind ()

倒回这个缓冲区。 该位置设置为零,标记被丢弃。

在一系列通道写入或获取操作之前调用此方法,假定已经适当地设置了限制。 例如:

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

Returns
Buffer This buffer

Hooray!