- 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 Object
array()
返回支持此缓冲区的数组 (可选操作) 。abstract int
arrayOffset()
返回此缓冲区缓冲区第一个元素的后备数组中的偏移量 (可选操作) 。int
capacity()
返回此缓冲区的容量。Buffer
clear()
清除此缓冲区。abstract Buffer
duplicate()
创建一个共享此缓冲区内容的新缓冲区。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()
倒回这个缓冲区。abstract Buffer
slice()
创建一个新缓冲区,其内容是此缓冲区内容的共享子序列。
-
-
-
方法详细信息
-
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()
告知当前位置和限制之间是否存在任何元素。- 结果
-
true
if且且仅当此缓冲区中至少有一个元素剩余时
-
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
-
-