|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
上一个类 下一个类 | 框架 无框架 | |||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
java.lang.Object java.nio.Buffer
public abstract class Buffer
一种用于特定的基本类型数据的容器。
缓冲区是特定的基本类型元素的线性、有限序列。缓冲区的基本属性除其内容外还包括容量、限制和位置:
缓冲区的容量 是它所包含的元素的数量。缓冲区的容量永远不会为负并且从不会更改。
缓冲区的限制 是不应读取或写入的第一个元素的索引。缓冲区的限制永远不会为负,并且永远不会大于其容量。
缓冲区的位置 是下一个要读取或写入的元素的索引。缓冲区的位置永远不会为负,并且永远不会大于其限制。
每个非 boolean 基本类型都存在此类的一个子类。
此类的每个子类都定义了两种 get 和 put 操作:
相对 操作读取或写入从当前位置开始的一个或多个元素,然后将该位置增加传输的元素的数量。如果请求的传输超过了限制,则相对 get 操作将抛出
BufferUnderflowException
,相对 put 操作将抛出BufferOverflowException
;但无论哪种情况,都不传输数据。绝对 操作采用显式元素索引,不会影响位置。如果索引参数超过了该限制,则绝对 get 和 put 操作将抛出
IndexOutOfBoundsException
。
当然,通过适当信道的 I/O 操作还可以将数据传输到缓冲区或从中传出数据(是传入还是传出,通常与当前位置有关)。
缓冲区的标记 是在调用 reset
方法时其位置将被重置的索引。并不是总要定义标记,但是,在定义标记时,永远不要将其定义为负数,并且永远不要大于其位置。如果定义了标记,则在位置或限制调整为小于标记的值时,该标记将被丢弃。如果未定义标记,则调用 reset
方法将导致抛出 InvalidMarkException
。
下面的不变式持有标记、位置、限制和容量值:
0 <= 标记 <= 位置 <= 限制 <= 容量
新创建的缓冲区总有一个零位置和一个未定义的标记。初始限制可以为零,也可以是其他某个值,这取决于缓冲区类型及其构建方式。一般情况下,缓冲区的初始内容未定义。
除了访问位置、限制、容量值以及做标记和重置等方法外,此类还对缓冲区定义了以下操作:
clear()
使缓冲区做好了新序列信道读取或相对 put 操作的准备:它将限制设置为容量大小,将位置设置为零。
flip()
使缓冲区做好了新序列信道读取或相对 get 操作的准备:它将限制设置为当前位置,然后将该位置设置为零。
rewind()
使缓冲区做好了重新读取已包含的数据的准备:它使限制保持不变,并将位置设置为零。
每个缓冲区都是可读取的,但并非每个缓冲区都是可写入的。每个缓冲区类的 mutation 方法都被指定为可选操作,当调用只读缓冲区时,将抛出 ReadOnlyBufferException
。只读缓冲区不允许更改其内容,但其标记、位置和限制值可以改变。缓冲区是否为只读通过调用其 isReadOnly
方法决定。
缓冲区由当前的多个线程使用是不安全的。如果一个缓冲区由不止一个线程使用,则应该通过适当的同步来控制对该缓冲区的访问。
指定此类中的方法(它们不返回其他值)以返回这些方法被调用时所在的缓冲区。此操作允许方法调用被连接;例如,语句序列
可以由下面单个、更紧凑的语句代替b.flip(); b.position(23); b.limit(42);
b.flip().position(23).limit(42);
方法摘要 | |
---|---|
int |
capacity()
返回此缓冲区的容量。 |
Buffer |
clear()
清除此缓冲区。 |
Buffer |
flip()
反转此缓冲区。 |
boolean |
hasRemaining()
判断在当前位置和限制之间是否有任何元素。 |
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 |
方法详细信息 |
---|
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()
在使用序列信道读取或 put 操作填充此缓冲区之前调用此方法。例如:
buf.clear(); // Prepare buffer for reading in.read(buf); // Read data
此方法不能实际擦除缓冲区中的数据,但从名称来看似乎能够擦除,因为它多数情况下确实是在擦除数据时使用的。
public final Buffer flip()
在序列信道读取或 put 操作之后,调用此方法以做好序列信道写入或相对 get 操作。例如:
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
方法一起使用。
public final Buffer rewind()
在序列信道写入或 get 操作之前调用此方法(假定已经适当设置了限制)。例如:
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()
|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
上一个类 下一个类 | 框架 无框架 | |||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
版权所有 2004 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策。