public abstract class Buffer extends Object
缓冲器是特定原始类型的元素的线性有限序列。 除了其内容,缓冲区的基本属性是其容量,限制和位置:
A buffer's capacity is the number of elements it contains. The capacity of a buffer is never negative and never changes.
A buffer's limit is the index of the first element that should not be read or written. A buffer's limit is never negative and is never greater than its capacity.
A buffer's position is the index of the next element to be read or written. A buffer's position is never negative and is never greater than its limit.
每个非布尔基元类型都有这个类的一个子类。
该类的每个子类定义了两类get和put操作:
Relative operations read or write one or more elements starting at the current position and then increment the position by the number of elements transferred. If the requested transfer exceeds the limit then a relative get operation throws a
BufferUnderflowException
and a relative put operation throws aBufferOverflowException
; in either case, no data is transferred.Absolute operations take an explicit element index and do not affect the position. Absolute get and put operations throw an
IndexOutOfBoundsException
if the index argument exceeds the limit.
当然,数据也可以通过相对于当前位置的相应通道的I / O操作被传送到或者从缓冲器传出。
当调用reset
方法时,缓冲区的标记是其位置将被重置的索引。 标记并不总是定义,但是当它被定义时,它不会是负的,并且永远不会大于位置。 如果标记被定义,则当位置或极限被调整为小于标记的值时,它被丢弃。 如果未定义标记,则调用reset
方法将导致抛出InvalidMarkException
。
标记,位置,极限和容量值的以下不变量保持不变:
0 <= mark <= position <= limit <= capacity
新创建的缓冲区始终具有零位置和未定义的标记。 初始限制可以为零,或者可以是取决于缓冲器的类型和构造方式的某些其他值。 新分配的缓冲区的每个元素被初始化为零。
除了访问位置,限制和容量值以及标记和重置的方法之外,此类还定义了缓冲区上的以下操作:
clear()
使缓冲区准备好信道读取或相对放置操作的一个新的序列:它设置了限制的能力和位置为零。
flip()
使缓冲区准备好新的通道写入或相对获取操作序列:它将限制设置为当前位置,然后将位置设置为零。
rewind()
使缓冲区准备好重新读取已经包含的数据:它保持限制不变,并将位置设置为零。
每个缓冲区都是可读的,但并不是每个缓冲区都是可写的。 每个缓冲区类的变异方法被指定为可选操作 ,当在只读缓冲区上调用时,它将抛出一个ReadOnlyBufferException
。 只读缓冲区不允许更改其内容,但其标记,位置和限制值是可变的。 缓冲区是否为只读可以通过调用其isReadOnly
方法来确定 。
缓冲区不能安全地被多个并发线程使用。 如果一个缓冲区被多个线程使用,则应该通过适当的同步来控制对缓冲区的访问。
指定此类中没有值返回值的方法返回调用它们的缓冲区。 这允许方法调用被链接; 例如,语句序列
可以由单一,更紧凑的语句替代b.flip(); b.position(23); b.limit(42);
b.flip().position(23).limit(42);
Modifier and Type | Method and Description |
---|---|
abstract Object |
array()
返回支持此缓冲区的数组
(可选操作) 。
|
abstract int |
arrayOffset()
返回该缓冲区的缓冲区的第一个元素的背衬数组中的偏移量
(可选操作) 。
|
int |
capacity()
返回此缓冲区的容量。
|
Buffer |
clear()
清除此缓冲区。
|
Buffer |
flip()
翻转这个缓冲区。
|
abstract boolean |
hasArray()
告诉这个缓冲区是否由可访问的数组支持。
|
boolean |
hasRemaining()
告诉当前位置和极限之间是否存在任何元素。
|
abstract boolean |
isDirect()
告诉这个缓冲区是否为
direct 。
|
abstract boolean |
isReadOnly()
告知这个缓冲区是否是只读的。
|
int |
limit()
返回此缓冲区的限制。
|
Buffer |
limit(int newLimit)
设置此缓冲区的限制。
|
Buffer |
mark()
将此缓冲区的标记设置在其位置。
|
int |
position()
返回此缓冲区的位置。
|
Buffer |
position(int newPosition)
设置这个缓冲区的位置。
|
int |
remaining()
返回当前位置和限制之间的元素数。
|
Buffer |
reset()
将此缓冲区的位置重置为先前标记的位置。
|
Buffer |
rewind()
倒带这个缓冲区。
|
public final int capacity()
public final int position()
public final Buffer position(int newPosition)
newPosition
- 新的位置值;
必须是非负数,不得大于当前限制
IllegalArgumentException
- 如果newPosition的
前提条件不成立
public final int limit()
public final Buffer limit(int newLimit)
newLimit
- 新限制值;
必须是非负数,不大于此缓冲区的容量
IllegalArgumentException
- 如果newLimit的
前提条件不成立
public final Buffer mark()
public final Buffer reset()
调用此方法既不会更改也不丢弃该标记的值。
InvalidMarkException
- 如果标记尚未设置
public final Buffer clear()
在使用一系列通道读取或放置操作填充此缓冲区之前调用此方法。 例如:
buf.clear(); // Prepare buffer for reading in.read(buf); // Read data
这个方法实际上并不会清除缓冲区中的数据,但是它被命名为它的确是因为它最常用于情况也是如此。
public final 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
public final Buffer rewind()
在通道写入或获取操作的序列之前调用此方法,假设已经设置了相应的限制。 例如:
out.write(buf); // Write remaining data buf.rewind(); // Rewind buffer buf.get(array); // Copy data into array
public final int remaining()
public final boolean hasRemaining()
public abstract boolean isReadOnly()
public abstract boolean hasArray()
如果此方法返回true,则可以安全地调用array
和arrayOffset
方法。
public abstract Object array()
该方法旨在使阵列支持的缓冲区更有效地传递到本地代码。 具体的子类为此方法提供了更强类型的返回值。
对此缓冲区内容的修改将导致返回的数组的内容被修改,反之亦然。
在调用此方法之前调用hasArray
方法,以确保此缓冲区具有可访问的后台阵列。
ReadOnlyBufferException
- 如果此缓冲区由数组支持但是只读
UnsupportedOperationException
- 如果此缓冲区未由可访问阵列支持
public abstract int arrayOffset()
如果此缓冲区由数组支持,那么缓冲位置p对应于数组索引p + arrayOffset() 。
在调用此方法之前调用hasArray
方法,以确保此缓冲区具有可访问的后备数组。
ReadOnlyBufferException
- 如果此缓冲区由数组支持但是只读
UnsupportedOperationException
- 如果此缓冲区不由可访问阵列支持
public abstract boolean isDirect()
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.