- java.lang.Object
-
- java.nio.Buffer
-
- 已知直接子类:
-
ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBuffer
public abstract class Buffer extends Object
用于特定基元类型的数据的容器。缓冲区是特定基元类型的线性有限元素序列。 除了它的内容,缓冲区的基本属性是它的容量,限制和位置:
缓冲区的容量是它包含的元素数。缓冲区的容量永远不会消极,永远不会改变。
缓冲区的限制是不应读取或写入的第一个元素的索引。缓冲区的限制永远不会为负,并且永远不会超过其容量。
缓冲区的位置是要读取或写入的下一个元素的索引。缓冲区的位置永远不会为负,并且永远不会超过其限制。
每个非布尔基元类型都有这个类的一个子类。
传输数据
此类的每个子类定义了两类得到和把操作:
相对操作从当前位置开始读取或写入一个或多个元素,然后按传输的元素数递增位置。如果请求的传输超过限制,则相对 get 操作将抛出
BufferUnderflowException和相对 put 操作会抛出BufferOverflowException;在任何一种情况下,都不会传输数据。绝对操作采用显式元素索引,不影响位置。绝对得到和把操作抛出一个
IndexOutOfBoundsException < / code>如果index参数超出限制。当然,数据也可以通过适当信道的I / O操作传送到缓冲器中或从缓冲器传出,这些操作总是相对于当前位置。
标记和重置
缓冲区标记是调用
reset方法时其位置将重置的索引 。 标记并不总是被定义,但是当它被定义时,它永远不会是负数,并且永远不会大于位置。 如果定义了标记,则在将位置或限制调整为小于标记的值时将其丢弃。 如果未定义标记,则调用reset方法会导致抛出InvalidMarkException。不变
以下不变量适用于标记,位置,限制和容量值:
0<=mark<=position<=limit<=capacity新创建的缓冲区始终具有零位置和未定义的标记。 初始限制可以是零,或者它可以是取决于缓冲器的类型和它的构造方式的某个其他值。 新分配的缓冲区的每个元素初始化为零。
附加操作
除了访问位置,限制和容量值以及标记和重置的方法之外,此类还在缓冲区上定义了以下操作:
clear()为一个新的通道读取或相对放置操作序列准备好缓冲区:它将容量限制和位置设置为零。flip()为一个新的通道写入或相对获取操作序列准备好缓冲区:它设置当前位置的限制,然后将位置设置为零。rewind()使缓冲区准备好重新读取它已包含的数据:它保持限制不变并将位置设置为零。slice()创建缓冲区的子序列:它保持限制和位置不变。duplicate()创建缓冲区的浅表副本:它保留限制和位置不变。
只读缓冲区
每个缓冲区都是可读的,但并非每个缓冲区都是可写的。 每个缓冲区类的变异方法被指定为可选操作 ,当在只读缓冲区上调用时,它将抛出
ReadOnlyBufferException。 只读缓冲区不允许更改其内容,但其标记,位置和限制值是可变的。 可以通过调用其isReadOnly方法来确定缓冲区是否是只读的。线程安全
多个并发线程使用缓冲区是不安全的。 如果要由多个线程使用缓冲区,则应通过适当的同步来控制对缓冲区的访问。
调用链接
此类中没有返回值的方法被指定为返回调用它们的缓冲区。 这允许方法调用被链接; 例如,语句序列
可以用单一,更紧凑的语句代替b.flip(); b.position(23); b.limit(42);
b.flip().position(23).limit(42);
- 从以下版本开始:
- 1.4
-
-
方法摘要
所有方法 实例方法 抽象方法 具体的方法 变量和类型 方法 描述 abstract Objectarray()返回支持此缓冲区的数组 (可选操作) 。abstract intarrayOffset()返回此缓冲区缓冲区第一个元素的后备数组中的偏移量 (可选操作) 。intcapacity()返回此缓冲区的容量。Bufferclear()清除此缓冲区。abstract Bufferduplicate()创建一个共享此缓冲区内容的新缓冲区。Bufferflip()翻转此缓冲区。abstract booleanhasArray()判断此缓冲区是否由可访问的数组支持。booleanhasRemaining()告知当前位置和限制之间是否存在任何元素。abstract booleanisDirect()判断此缓冲区是否为 direct 。abstract booleanisReadOnly()判断此缓冲区是否为只读。intlimit()返回此缓冲区的限制。Bufferlimit(int newLimit)设置此缓冲区的限制。Buffermark()在此位置设置此缓冲区的标记。intposition()返回此缓冲区的位置。Bufferposition(int newPosition)设置此缓冲区的位置。intremaining()返回当前位置和限制之间的元素数。Bufferreset()将此缓冲区的位置重置为先前标记的位置。Bufferrewind()倒回这个缓冲区。abstract Bufferslice()创建一个新缓冲区,其内容是此缓冲区内容的共享子序列。
-
-
-
方法详细信息
-
capacity
public final int capacity()
返回此缓冲区的容量。- 结果
- 这个缓冲区的容量
-
position
public final int position()
返回此缓冲区的位置。- 结果
- 这个缓冲区的位置
-
position
public Buffer position(int newPosition)
设置此缓冲区的位置。 如果标记已定义且大于新位置,则将其丢弃。- 参数
-
newPosition- 新的头寸价值; 必须是非负的且不大于当前限制 - 结果
- 这个缓冲区
- 异常
-
IllegalArgumentException-如果前提newPosition不成立
-
limit
public final int limit()
返回此缓冲区的限制。- 结果
- 这个缓冲区的限制
-
limit
public Buffer limit(int newLimit)
设置此缓冲区的限制。 如果该位置大于新限制,则将其设置为新限制。 如果标记已定义且大于新限制,则将其丢弃。- 参数
-
newLimit- 新的限制值; 必须是非负的且不大于此缓冲区的容量 - 结果
- 这个缓冲区
- 异常
-
IllegalArgumentException-如果前提newLimit不成立
-
mark
public Buffer mark()
在此位置设置此缓冲区的标记。- 结果
- 这个缓冲区
-
reset
public Buffer reset()
将此缓冲区的位置重置为先前标记的位置。调用此方法既不会更改也不会丢弃标记的值。
- 结果
- 这个缓冲区
- 异常
-
InvalidMarkException- 如果尚未设置标记
-
clear
public Buffer clear()
清除此缓冲区。 位置设置为零,限制设置为容量,标记将被丢弃。在使用一系列通道读取或放置操作来填充此缓冲区之前调用此方法。 例如:
buf.clear(); // Prepare buffer for reading in.read(buf); // Read data
这种方法实际上并没有擦除缓冲区中的数据,但是它的命名就好像它一样,因为它最常用于那种情况。
- 结果
- 这个缓冲区
-
flip
public 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
将数据从一个地方传输到另一个地方时,此方法通常与
compact方法结合使用。- 结果
- 这个缓冲区
-
rewind
public Buffer rewind()
倒回这个缓冲区。 位置设置为零,标记被丢弃。假设已经适当地设置了限制,在一系列通道写入或获取操作之前调用此方法。 例如:
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()
告知当前位置和限制之间是否存在任何元素。- 结果
-
trueif且且仅当此缓冲区中至少有一个元素剩余时
-
isReadOnly
public abstract boolean isReadOnly()
判断此缓冲区是否为只读。- 结果
-
true当且仅当此缓冲区为只读时
-
hasArray
public abstract boolean hasArray()
判断此缓冲区是否由可访问的数组支持。如果此方法返回
true则可以安全地调用array和arrayOffset方法。- 结果
-
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()
判断此缓冲区是否为 direct 。- 结果
-
true当且仅当此缓冲区是直接的 - 从以下版本开始:
- 1.6
-
slice
public abstract Buffer slice()
创建一个新缓冲区,其内容是此缓冲区内容的共享子序列。新缓冲区的内容将从此缓冲区的当前位置开始。 对此缓冲区内容的更改将在新缓冲区中可见,反之亦然; 两个缓冲区的位置,限制和标记值将是独立的。
新缓冲区的位置将为零,其容量和限制将是此缓冲区中剩余的元素数,其标记将是未定义的。 当且仅当此缓冲区是直接缓冲区时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读时,它才是只读的。
- 结果
- 新的缓冲区
- 从以下版本开始:
- 9
-
duplicate
public abstract Buffer duplicate()
创建一个共享此缓冲区内容的新缓冲区。新缓冲区的内容将是此缓冲区的内容。 对此缓冲区内容的更改将在新缓冲区中可见,反之亦然; 两个缓冲区的位置,限制和标记值将是独立的。
新缓冲区的容量,限制,位置和标记值将与此缓冲区的容量,限制,位置和标记值相同。 当且仅当此缓冲区是直接缓冲区时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读时,它才是只读的。
- 结果
- 新的缓冲区
- 从以下版本开始:
- 9
-
-