public abstract class Buffer
extends Object
java.lang.Object | |
↳ | java.nio.Buffer |
Known Direct Subclasses |
Known Indirect Subclasses |
一个特定基元类型数据的容器。
缓冲区是特定基本类型的线性有限元素序列。 除了内容之外,缓冲区的基本属性是其容量,限制和位置:
缓冲区的容量是它包含的元素的数量。 缓冲区的容量永远不会消失,永远不会改变。
缓冲区的限制是不应读取或写入的第一个元素的索引。 缓冲区的限制永远不会是负面的,永远不会大于其容量。
缓冲区的位置是要读取或写入的下一个元素的索引。 缓冲区的位置永远不会是负值,永远不会超过其极限。
这个类的每个非布尔基元类型都有一个子类。
这个类的每个子类定义了两类 get和 put操作:
相对操作从当前位置开始读取或写入一个或多个元素,然后按传送的元素数量递增位置。 如果请求的传输超过限制,则相对获取操作将抛出
BufferUnderflowException
并且相对放置操作抛出BufferOverflowException
; 在任何情况下,都不会传输数据。绝对操作采用明确的元素索引,不影响位置。 如果索引参数超出限制,则绝对get和put操作会抛出
IndexOutOfBoundsException
。
当然,数据也可以通过合适通道的I / O操作传送进或传出缓冲区,这些操作始终与当前位置相关。
缓冲区标志是调用reset
方法时其位置将被重置的reset
。 标记并不总是被定义的,但是当它被定义时,它永远不会是负的,并且永远不会超过该位置。 如果标记被定义,那么当位置或极限值被调整到小于标记的值时,它将被丢弃。 如果标记未定义,则调用reset
方法将导致引发InvalidMarkException
。
以下不变量适用于标记,位置,限制和容量值:
0 <= mark <= position <= limit <= capacity
新创建的缓冲区总是有一个零位和一个未定义的标记。 初始限制可能为零,也可能是其他值,这取决于缓冲区的类型和构造方式。 新分配的缓冲区的每个元素都初始化为零。
除了用于访问位置,限制和容量值以及用于标记和重置的方法之外,该类还定义了以下缓冲区操作:
clear()
为一个新的通道读取或相对 放置操作序列创建缓冲区:它将容量和位置的限制设置为零。
flip()
为新的通道写入或相对 获取操作序列创建缓冲区:它将限制设置为当前位置,然后将位置设置为零。
rewind()
使缓冲区准备好重新读取它已包含的数据:它将保持极限不变并将位置设置为零。
每个缓冲区都是可读的,但不是每个缓冲区都是可写的。 每个缓冲区类的突变方法被指定为可选操作 ,当在只读缓冲区上调用时,该操作将抛出ReadOnlyBufferException
。 只读缓冲区不允许更改其内容,但其标记,位置和限制值是可变的。 缓冲区是否为只读可以通过调用其isReadOnly
方法来确定。
缓冲区不适合多个并发线程使用。 如果多个线程使用缓冲区,则应该通过适当的同步来控制对缓冲区的访问。
指定此类中不具有返回值的方法以返回调用它们的缓冲区。 这允许方法调用被链接; 例如,语句的顺序
can be replaced by the single, more compact statementb.flip(); b.position(23); b.limit(42);
b.flip().position(23).limit(42);
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
|
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 |
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 |
Buffer clear ()
清除此缓冲区。 位置被设置为零,限制被设置为容量,并且标记被丢弃。
在使用通道读取或放置操作序列填充此缓冲区之前调用此方法。 例如:
buf.clear(); // Prepare buffer for reading in.read(buf); // Read data
这种方法实际上并不会擦除缓冲区中的数据,但它的名称就像它的名字一样,因为它最常用于那种情况下。
Returns | |
---|---|
Buffer |
This buffer |
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 |
boolean hasArray ()
告诉这个缓冲区是否由一个可访问的数组支持。
如果此方法返回 true,则可以安全地调用 array
和 arrayOffset
方法。
Returns | |
---|---|
boolean |
true if, and only if, this buffer is backed by an array and is not read-only |
boolean hasRemaining ()
告诉当前位置和限制之间是否有任何元素。
Returns | |
---|---|
boolean |
true if, and only if, there is at least one element remaining in this buffer |
boolean isDirect ()
判断这个缓冲区是否为 direct 。
Returns | |
---|---|
boolean |
true if, and only if, this buffer is direct |
boolean isReadOnly ()
告诉这个缓冲区是否是只读的。
Returns | |
---|---|
boolean |
true if, and only if, this buffer is read-only |
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 |
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 |
int remaining ()
返回当前位置和限制之间的元素数量。
Returns | |
---|---|
int |
The number of elements remaining in this buffer |
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 |
Buffer rewind ()
倒回这个缓冲区。 该位置设置为零,标记被丢弃。
在一系列通道写入或获取操作之前调用此方法,假定已经适当地设置了限制。 例如:
out.write(buf); // Write remaining data buf.rewind(); // Rewind buffer buf.get(array); // Copy data into array
Returns | |
---|---|
Buffer |
This buffer |