- 所有已实现的接口:
Comparable<ByteBuffer>
- 已知子类:
MappedByteBuffer
此类定义了六类对字节缓冲区的操作:
绝对和相对
bulk get
方法,将连续的字节序列从该缓冲区传输到数组中;绝对和相对
bulk put
方法,将字节数组或其他字节缓冲区中的连续字节序列传输到此缓冲区中;创建方法查看缓冲区 ,它允许将字节缓冲区视为包含其他原始类型值的缓冲区;和
compacting
字节缓冲区的方法。
字节缓冲区可以通过 allocation
创建,它为缓冲区的内容分配空间,或者通过 wrapping
将现有字节数组放入缓冲区。
直接的对比非直接缓冲区
字节缓冲区是直接的或者非直接的.给定直接字节缓冲区,Java 虚拟机将尽最大努力直接在其上执行本机 I/O 操作。也就是说,它将尝试避免在每次调用底层操作系统的本机 I/O 操作之一之前(或之后)将缓冲区的内容复制到(或从)中间缓冲区。
可以通过调用此类的allocateDirect
工厂方法来创建直接字节缓冲区。此方法返回的缓冲区通常比非直接缓冲区具有更高的分配和释放成本。直接缓冲区的内容可能驻留在正常的垃圾收集堆之外,因此它们对应用程序内存占用的影响可能并不明显。因此,建议直接缓冲区主要分配给受底层系统的本机 I/O 操作影响的大型、长期缓冲区。通常,最好仅在直接缓冲区在程序性能方面产生可衡量的增益时才分配它们。
直接字节缓冲区也可以通过mapping
文件区域直接创建到内存中。 Java 平台的实现可以选择支持通过 JNI 从本机代码创建直接字节缓冲区。如果其中一种缓冲区的实例引用了不可访问的内存区域,那么访问该区域的尝试将不会更改缓冲区的内容,并且会导致在访问时或稍后抛出未指定的异常时间。
字节缓冲区是直接缓冲区还是非直接缓冲区可以通过调用其 isDirect
方法来确定。提供此方法以便可以在性能关键代码中完成显式缓冲区管理。
访问二进制数据
此类定义了读取和写入所有其他基本类型值的方法,boolean
除外。原始值根据缓冲区的当前字节顺序转换为(或从)字节序列,可以通过 order
方法检索和修改。特定的字节顺序由 ByteOrder
类的实例表示。字节缓冲区的初始顺序始终是 BIG_ENDIAN
。
为了访问异构二进制数据,即不同类型的值序列,此类定义了一个绝对和相对的族get和put每种类型的方法。例如,对于 32 位浮点值,此类定义:
floatgetFloat()
floatgetFloat(int index)
ByteBufferputFloat(float f)
ByteBufferputFloat(int index, float f)
为类型 char, short, int, long
和 double
定义了相应的方法。绝对的索引参数get和put方法以字节为单位,而不是以读取或写入的类型为单位。
为了访问同类二进制数据,即相同类型的值序列,此类定义了可以创建的方法观点给定的字节缓冲区。 A查看缓冲区只是另一个缓冲区,其内容由字节缓冲区支持。字节缓冲区内容的更改将在视图缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值是独立的。例如,asFloatBuffer
方法创建了一个 FloatBuffer
类的实例,该实例由调用该方法的字节缓冲区支持。为类型 char, short, int, long
和 double
定义了相应的视图创建方法。
与特定类型的系列相比,视图缓冲区具有三个重要优势get和put上述方法:
视图缓冲区不是根据字节索引,而是根据其值的特定于类型的大小进行索引;
视图缓冲区提供相对体积get和put可以在缓冲区和数组或相同类型的其他缓冲区之间传输连续值序列的方法;和
视图缓冲区可能更有效,因为当且仅当其后备字节缓冲区是直接的时,它才会是直接的。
视图缓冲区的字节顺序固定为创建视图时其字节缓冲区的字节顺序。
调用链接
此类中没有返回值的方法被指定为返回调用它们的缓冲区。这允许链接方法调用。语句的顺序
例如,可以用单个语句代替bb.putInt(0xCAFEBABE); bb.putShort(3); bb.putShort(45);
bb.putInt(0xCAFEBABE).putShort(3).putShort(45);
- 自从:
- 1.4
-
方法总结
修饰符和类型方法描述final ByteBuffer
alignedSlice
(int unitSize) 创建一个新的字节缓冲区,其内容是此缓冲区内容的共享且对齐的子序列。final int
alignmentOffset
(int index, int unitSize) 返回内存地址,指向给定索引处的字节,以给定的单元大小为模。static ByteBuffer
allocate
(int capacity) 分配一个新的字节缓冲区。static ByteBuffer
allocateDirect
(int capacity) 分配一个新的直接字节缓冲区。final byte[]
array()
返回支持此缓冲区的字节数组(可选操作).final int
返回缓冲区第一个元素在此缓冲区的后备数组中的偏移量(可选操作).abstract CharBuffer
创建此字节缓冲区的视图作为字符缓冲区。abstract DoubleBuffer
创建此字节缓冲区的视图作为双缓冲区。abstract FloatBuffer
创建此字节缓冲区的视图作为浮点缓冲区。abstract IntBuffer
创建此字节缓冲区的视图作为 int 缓冲区。abstract LongBuffer
创建此字节缓冲区的视图作为长缓冲区。abstract ByteBuffer
创建一个共享此缓冲区内容的新的只读字节缓冲区。abstract ShortBuffer
创建此字节缓冲区的视图作为短缓冲区。clear()
清除此缓冲区。abstract ByteBuffer
compact()
压缩此缓冲区(可选操作).int
compareTo
(ByteBuffer that) 将此缓冲区与另一个缓冲区进行比较。abstract ByteBuffer
创建一个共享此缓冲区内容的新字节缓冲区。boolean
告知此缓冲区是否等于另一个对象。flip()
翻转此缓冲区。abstract byte
get()
相对的get方法。get
(byte[] dst) 相对体积get方法。get
(byte[] dst, int offset, int length) 相对体积get方法。abstract byte
get
(int index) 绝对get方法。get
(int index, byte[] dst) 绝对散装get方法。get
(int index, byte[] dst, int offset, int length) 绝对散装get方法。abstract char
getChar()
相对的get读取 char 值的方法。abstract char
getChar
(int index) 绝对get读取 char 值的方法。abstract double
相对的get读取双精度值的方法。abstract double
getDouble
(int index) 绝对get读取双精度值的方法。abstract float
getFloat()
相对的get读取浮点值的方法。abstract float
getFloat
(int index) 绝对get读取浮点值的方法。abstract int
getInt()
相对的get读取 int 值的方法。abstract int
getInt
(int index) 绝对get读取 int 值的方法。abstract long
getLong()
相对的get读取长值的方法。abstract long
getLong
(int index) 绝对get读取长值的方法。abstract short
getShort()
相对的get读取短值的方法。abstract short
getShort
(int index) 绝对get读取短值的方法。final boolean
hasArray()
告知此缓冲区是否由可访问的字节数组支持。int
hashCode()
返回此缓冲区的当前哈希码。abstract boolean
isDirect()
判断这个字节缓冲区是否是直接的。limit
(int newLimit) 设置此缓冲区的限制。mark()
在其位置设置此缓冲区的标记。int
mismatch
(ByteBuffer that) 查找并返回此缓冲区与给定缓冲区之间第一个不匹配的相对索引。final ByteOrder
order()
检索此缓冲区的字节顺序。final ByteBuffer
修改此缓冲区的字节顺序。position
(int newPosition) 设置此缓冲区的位置。abstract ByteBuffer
put
(byte b) 相对的put方法(可选操作).final ByteBuffer
put
(byte[] src) 相对体积put方法(可选操作).put
(byte[] src, int offset, int length) 相对体积put方法(可选操作).abstract ByteBuffer
put
(int index, byte b) 绝对put方法(可选操作).put
(int index, byte[] src) 绝对散装put方法(可选操作).put
(int index, byte[] src, int offset, int length) 绝对散装put方法(可选操作).put
(int index, ByteBuffer src, int offset, int length) 绝对散装put方法(可选操作).put
(ByteBuffer src) 相对体积put方法(可选操作).abstract ByteBuffer
putChar
(char value) 相对的put写入字符值的方法(可选操作).abstract ByteBuffer
putChar
(int index, char value) 绝对put写入字符值的方法(可选操作).abstract ByteBuffer
putDouble
(double value) 相对的put写双精度值的方法(可选操作).abstract ByteBuffer
putDouble
(int index, double value) 绝对put写双精度值的方法(可选操作).abstract ByteBuffer
putFloat
(float value) 相对的put写入浮点值的方法(可选操作).abstract ByteBuffer
putFloat
(int index, float value) 绝对put写入浮点值的方法(可选操作).abstract ByteBuffer
putInt
(int value) 相对的put写入int值的方法(可选操作).abstract ByteBuffer
putInt
(int index, int value) 绝对put写入int值的方法(可选操作).abstract ByteBuffer
putLong
(int index, long value) 绝对put写入长值的方法(可选操作).abstract ByteBuffer
putLong
(long value) 相对的put写入长值的方法(可选操作).abstract ByteBuffer
putShort
(int index, short value) 绝对put写入短值的方法(可选操作).abstract ByteBuffer
putShort
(short value) 相对的put写入短值的方法(可选操作).reset()
将此缓冲区的位置重置为先前标记的位置。rewind()
倒带此缓冲区。abstract ByteBuffer
slice()
创建一个新的字节缓冲区,其内容是此缓冲区内容的共享子序列。abstract ByteBuffer
slice
(int index, int length) 创建一个新的字节缓冲区,其内容是此缓冲区内容的共享子序列。toString()
返回总结此缓冲区状态的字符串。static ByteBuffer
wrap
(byte[] array) 将字节数组包装到缓冲区中。static ByteBuffer
wrap
(byte[] array, int offset, int length) 将字节数组包装到缓冲区中。在类 java.nio.Buffer 中声明的方法
capacity, hasRemaining, isReadOnly, limit, position, remaining
-
方法详情
-
allocateDirect
分配一个新的直接字节缓冲区。新缓冲区的位置将为零,其限制为其容量,其标记将未定义,其每个元素都将初始化为零,其字节顺序将为
BIG_ENDIAN
。它是否有backing array
未指定。- 参数:
capacity
- 新缓冲区的容量,以字节为单位- 返回:
- 新的字节缓冲区
- 抛出:
IllegalArgumentException
- 如果capacity
是负整数
-
allocate
分配一个新的字节缓冲区。新缓冲区的位置将为零,其限制为其容量,其标记将未定义,其每个元素都将初始化为零,其字节顺序将为
BIG_ENDIAN
。它会有一个backing array
,它的array offset
将为零。- 参数:
capacity
- 新缓冲区的容量,以字节为单位- 返回:
- 新的字节缓冲区
- 抛出:
IllegalArgumentException
- 如果capacity
是负整数
-
wrap
将字节数组包装到缓冲区中。新缓冲区将由给定的字节数组支持;也就是说,对缓冲区的修改将导致数组被修改,反之亦然。新缓冲区的容量将为
array.length
,位置为offset
,限制为offset + length
,标记未定义,字节顺序为BIG_ENDIAN
。它的backing array
将是给定的数组,而它的array offset
将为零。- 参数:
array
- 将支持新缓冲区的数组offset
- 要使用的子数组的偏移量;必须为非负且不大于array.length
。新缓冲区的位置将设置为此值。length
- 要使用的子数组的长度;必须为非负且不大于array.length - offset
。新缓冲区的限制将设置为offset + length
。- 返回:
- 新的字节缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果offset
和length
参数的先决条件不成立
-
wrap
将字节数组包装到缓冲区中。新缓冲区将由给定的字节数组支持;也就是说,对缓冲区的修改将导致数组被修改,反之亦然。新缓冲区的容量和限制将为
array.length
,其位置将为零,其标记将未定义,其字节顺序将为BIG_ENDIAN
。它的backing array
将是给定的数组,而它的array offset
将为零。- 参数:
array
- 将支持此缓冲区的数组- 返回:
- 新的字节缓冲区
-
slice
创建一个新的字节缓冲区,其内容是此缓冲区内容的共享子序列。新缓冲区的内容将从该缓冲区的当前位置开始。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。
新缓冲区的位置将为零,其容量和限制将为该缓冲区中剩余的字节数,其标记将未定义,其字节顺序将为
BIG_ENDIAN
。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。 -
slice
创建一个新的字节缓冲区,其内容是此缓冲区内容的共享子序列。新缓冲区的内容将从该缓冲区中的位置
index
开始,并将包含length
个元素。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。新缓冲区的位置将为零,其容量和限制将为
length
,其标记将未定义,其字节顺序将为BIG_ENDIAN
。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。- 指定者:
slice
在类Buffer
中- 参数:
index
- 该缓冲区中新缓冲区内容开始的位置;必须为非负且不大于limit()
length
- 新缓冲区将包含的元素数;必须为非负且不大于limit() - index
- 返回:
- 新缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果index
为负或大于limit()
,则length
为负,或length > limit() - index
- 自从:
- 13
-
duplicate
创建一个共享此缓冲区内容的新字节缓冲区。新缓冲区的内容将是该缓冲区的内容。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。
新缓冲区的容量、限制、位置和标记值将与该缓冲区的相同,其字节顺序将为
BIG_ENDIAN
。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。 -
asReadOnlyBuffer
创建一个共享此缓冲区内容的新的只读字节缓冲区。新缓冲区的内容将是该缓冲区的内容。对此缓冲区内容的更改将在新缓冲区中可见;然而,新缓冲区本身将是只读的,并且不允许修改共享内容。两个缓冲区的位置、限制和标记值将是独立的。
新缓冲区的容量、限制、位置和标记值将与该缓冲区的相同,其字节顺序将为
BIG_ENDIAN
。如果此缓冲区本身是只读的,则此方法的行为方式与
duplicate
方法完全相同。- 返回:
- 新的只读字节缓冲区
-
get
public abstract byte get()相对的get方法。读取此缓冲区当前位置的字节,然后递增该位置。- 返回:
- 缓冲区当前位置的字节
- 抛出:
BufferUnderflowException
- 如果缓冲区的当前位置不小于其限制
-
put
相对的put方法(可选操作).将给定字节写入此缓冲区的当前位置,然后递增该位置。
- 参数:
b
- 要写入的字节- 返回:
- 这个缓冲区
- 抛出:
BufferOverflowException
- 如果此缓冲区的当前位置不小于其限制ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
get
public abstract byte get(int index) 绝对get方法。读取给定索引处的字节。- 参数:
index
- 将从中读取字节的索引- 返回:
- 给定索引处的字节
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制
-
put
绝对put方法(可选操作).在给定索引处将给定字节写入此缓冲区。
- 参数:
index
- 写入字节的索引b
- 要写入的字节值- 返回:
- 这个缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
get
相对体积get方法。此方法将字节从此缓冲区传输到给定的目标数组。如果缓冲区中剩余的字节数少于满足请求所需的字节数,即如果
length
>
remaining()
,则不传输任何字节并抛出BufferUnderflowException
。否则,此方法将
length
字节从该缓冲区复制到给定数组,从该缓冲区的当前位置和数组中的给定偏移量开始。然后这个缓冲区的位置增加length
。换句话说,调用
src.get(dst, off, len)
形式的方法与循环具有完全相同的效果
除了它首先检查此缓冲区中是否有足够的字节并且它可能更有效。for (int i = off; i < off + len; i++) dst[i] = src.get();
- 参数:
dst
- 要写入字节的数组offset
- 要写入的第一个字节在数组中的偏移量;必须为非负且不大于dst.length
length
- 要写入给定数组的最大字节数;必须为非负且不大于dst.length - offset
- 返回:
- 这个缓冲区
- 抛出:
BufferUnderflowException
- 如果此缓冲区中剩余的字节数少于length
IndexOutOfBoundsException
- 如果offset
和length
参数的先决条件不成立
-
get
相对体积get方法。此方法将字节从此缓冲区传输到给定的目标数组。调用
src.get(a)
形式的方法的行为与调用完全相同src.get(a, 0, a.length)
- 参数:
dst
- 目标数组- 返回:
- 这个缓冲区
- 抛出:
BufferUnderflowException
- 如果此缓冲区中剩余的字节数少于length
-
get
绝对散装get方法。此方法将
length
字节从该缓冲区传输到给定数组,从该缓冲区中的给定索引和数组中的给定偏移量开始。这个缓冲区的位置没有改变。调用
src.get(index, dst, offset, length)
形式的此方法与以下循环具有完全相同的效果,除了它首先检查提供的参数的一致性并且它可能更有效:for (int i = offset, j = index; i < offset + length; i++, j++) dst[i] = src.get(j);
- 参数:
index
- 该缓冲区中的索引,将从中读取第一个字节;必须为非负且小于limit()
dst
- 目标数组offset
- 要写入的第一个字节在数组中的偏移量;必须为非负且小于dst.length
length
- 要写入给定数组的字节数;必须为非负且不大于limit() - index
和dst.length - offset
中的较小者- 返回:
- 这个缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果index
、offset
和length
参数的先决条件不成立- 自从:
- 13
-
get
绝对散装get方法。此方法将字节从此缓冲区传输到给定的目标数组。这个缓冲区的位置没有改变。调用
src.get(index, dst)
形式的方法的行为与调用完全相同:src.get(index, dst, 0, dst.length)
- 参数:
index
- 该缓冲区中的索引,将从中读取第一个字节;必须为非负且小于limit()
dst
- 目标数组- 返回:
- 这个缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果index
为负,不小于limit()
或limit() - index < dst.length
- 自从:
- 13
-
put
相对体积put方法(可选操作).此方法将给定源缓冲区中剩余的字节传输到此缓冲区中。如果源缓冲区中剩余的字节数多于此缓冲区中的字节数,即如果
src.remaining()
>
remaining()
,则不传输任何字节并抛出BufferOverflowException
。否则,此方法复制n=
src.remaining()
字节从给定缓冲区到此缓冲区,从每个缓冲区的当前位置开始。然后将两个缓冲区的位置递增n.换句话说,调用
dst.put(src)
形式的方法与循环具有完全相同的效果while (src.hasRemaining()) dst.put(src.get());
除了它首先检查此缓冲区中是否有足够的空间并且它可能更有效。如果此缓冲区和源缓冲区共享相同的后备数组或内存,则结果将好像源元素在写入此缓冲区之前首先复制到中间位置。- 参数:
src
- 要从中读取字节的源缓冲区;不能是这个缓冲区- 返回:
- 这个缓冲区
- 抛出:
BufferOverflowException
- 如果此缓冲区中的空间不足以容纳源缓冲区中的剩余字节IllegalArgumentException
- 如果源缓冲区是这个缓冲区ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
put
绝对散装put方法(可选操作).此方法将
length
字节从给定的源缓冲区传输到此缓冲区,从源缓冲区中的给定offset
和此缓冲区中的给定index
开始。两个缓冲区的位置都没有改变。换句话说,调用
dst.put(index, src, offset, length)
形式的方法与循环具有完全相同的效果
除了它首先检查提供的参数的一致性并且它可能更有效。如果此缓冲区和源缓冲区共享相同的后备数组或内存,则结果将好像源元素在写入此缓冲区之前首先复制到中间位置。for (int i = offset, j = index; i < offset + length; i++, j++) dst.put(j, src.get(i));
- 参数:
index
- 该缓冲区中将写入第一个字节的索引;必须为非负且小于limit()
src
- 要从中读取字节的缓冲区offset
- 要读取的第一个字节在源缓冲区中的索引;必须为非负且小于src.limit()
length
- 要从给定缓冲区读取的字节数;必须为非负且不大于limit() - index
和src.limit() - offset
中的较小者- 返回:
- 这个缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果index
、offset
和length
参数的先决条件不成立ReadOnlyBufferException
- 如果这个缓冲区是只读的- 自从:
- 16
-
put
相对体积put方法(可选操作).此方法将字节从给定的源数组传输到此缓冲区。如果要从数组中复制的字节数多于此缓冲区中剩余的字节数,即如果
length
>
remaining()
,则不传输任何字节并抛出BufferOverflowException
。否则,此方法将给定数组中的
length
个字节复制到此缓冲区中,从数组中的给定偏移量开始,并在此缓冲区的当前位置。然后这个缓冲区的位置增加length
。换句话说,调用
dst.put(src, off, len)
形式的方法与循环具有完全相同的效果
除了它首先检查此缓冲区中是否有足够的空间并且它可能更有效。for (int i = off; i < off + len; i++) dst.put(src[i]);
- 参数:
src
- 要从中读取字节的数组offset
- 要读取的第一个字节在数组中的偏移量;必须为非负且不大于src.length
length
- 要从给定数组中读取的字节数;必须为非负且不大于src.length - offset
- 返回:
- 这个缓冲区
- 抛出:
BufferOverflowException
- 如果缓冲区空间不足IndexOutOfBoundsException
- 如果offset
和length
参数的先决条件不成立ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
put
相对体积put方法(可选操作).此方法将给定源字节数组的全部内容传输到此缓冲区中。调用
dst.put(a)
形式的方法的行为与调用完全相同dst.put(a, 0, a.length)
- 参数:
src
- 源数组- 返回:
- 这个缓冲区
- 抛出:
BufferOverflowException
- 如果缓冲区空间不足ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
put
绝对散装put方法(可选操作).此方法从给定数组传输
length
个字节,从数组中的给定偏移量开始,并在此缓冲区中的给定索引处。这个缓冲区的位置没有改变。调用
dst.put(index, src, offset, length)
形式的此方法与以下循环具有完全相同的效果,除了它首先检查提供的参数的一致性并且它可能更有效:for (int i = offset, j = index; i < offset + length; i++, j++) dst.put(j, src[i]);
- 参数:
index
- 该缓冲区中将写入第一个字节的索引;必须为非负且小于limit()
src
- 要从中读取字节的数组offset
- 要读取的第一个字节在数组中的偏移量;必须为非负且小于src.length
length
- 要从给定数组中读取的字节数;必须为非负且不大于limit() - index
和src.length - offset
中的较小者- 返回:
- 这个缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果index
、offset
和length
参数的先决条件不成立ReadOnlyBufferException
- 如果这个缓冲区是只读的- 自从:
- 13
-
put
绝对散装put方法(可选操作).此方法将字节从给定的源数组复制到此缓冲区中。这个缓冲区的位置没有改变。对
dst.put(index, src)
形式的方法的调用与调用的行为完全相同:dst.put(index, src, 0, src.length);
- 参数:
index
- 该缓冲区中将写入第一个字节的索引;必须为非负且小于limit()
src
- 要从中读取字节的数组- 返回:
- 这个缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果index
为负,不小于limit()
或limit() - index < src.length
ReadOnlyBufferException
- 如果这个缓冲区是只读的- 自从:
- 13
-
hasArray
public final boolean hasArray()告知此缓冲区是否由可访问的字节数组支持。如果此方法返回
true
,则可以安全地调用array
和arrayOffset
方法。 -
array
public final byte[] array()返回支持此缓冲区的字节数组(可选操作).对此缓冲区内容的修改将导致返回数组的内容被修改,反之亦然。
在调用此方法之前调用
hasArray
方法,以确保此缓冲区具有可访问的后备数组。- 指定者:
array
在类Buffer
中- 返回:
- 支持此缓冲区的数组
- 抛出:
ReadOnlyBufferException
- 如果此缓冲区由数组支持但为只读UnsupportedOperationException
- 如果此缓冲区不受可访问数组的支持
-
arrayOffset
public final int arrayOffset()返回缓冲区第一个元素在此缓冲区的后备数组中的偏移量(可选操作).如果此缓冲区由数组支持,则缓冲区位置p对应数组索引p
arrayOffset()
。在调用此方法之前调用
hasArray
方法,以确保此缓冲区具有可访问的后备数组。- 指定者:
arrayOffset
在类Buffer
中- 返回:
- 缓冲区第一个元素在此缓冲区数组中的偏移量
- 抛出:
ReadOnlyBufferException
- 如果此缓冲区由数组支持但为只读UnsupportedOperationException
- 如果此缓冲区不受可访问数组的支持
-
position
设置此缓冲区的位置。如果标记已定义且大于新位置,则将其丢弃。 -
limit
设置此缓冲区的限制。如果位置大于新限制,则将其设置为新限制。如果标记已定义且大于新限制,则将其丢弃。 -
mark
在其位置设置此缓冲区的标记。 -
reset
将此缓冲区的位置重置为先前标记的位置。调用此方法既不会更改也不会丢弃标记的值。
-
clear
清除此缓冲区。位置设置为零,限制设置为容量,标记被丢弃。在使用一系列通道读取或之前调用此方法put填充此缓冲区的操作。例如:
buf.clear(); // Prepare buffer for reading in.read(buf); // Read data
这种方法实际上并没有擦除缓冲区中的数据,但它的命名就好像它确实擦除一样,因为它最常用于可能是这种情况的情况。
-
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
方法结合使用。 -
rewind
倒带此缓冲区。位置设置为零,标记被丢弃。在一系列通道写入或之前调用此方法get操作,假设已经适当地设置了限制。例如:
out.write(buf); // Write remaining data buf.rewind(); // Rewind buffer buf.get(array); // Copy data into array
-
compact
压缩此缓冲区(可选操作).缓冲区的当前位置与其限制之间的字节(如果有)被复制到缓冲区的开头。即索引处的字节p=
position()
被复制到索引零,索引处的字节p1 被复制到索引 1,依此类推,直到索引limit()
- 1 处的字节被复制到索引nlimit()
-1
-p.缓冲区的位置然后设置为n+1个其限制设置为其容量。标记(如果已定义)将被丢弃。缓冲区的位置设置为复制的字节数,而不是零,因此调用此方法后可以立即调用另一个相关方法put方法。
在从缓冲区写入数据后调用此方法,以防写入不完整。例如,以下循环通过缓冲区
buf
将字节从一个通道复制到另一个通道:buf.clear(); // Prepare buffer for use while (in.read(buf) >= 0 || buf.position != 0) { buf.flip(); out.write(buf); buf.compact(); // In case of partial write }
- 返回:
- 这个缓冲区
- 抛出:
ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
isDirect
public abstract boolean isDirect()判断这个字节缓冲区是否是直接的。 -
toString
返回总结此缓冲区状态的字符串。 -
hashCode
public int hashCode()返回此缓冲区的当前哈希码。字节缓冲区的哈希码仅取决于其剩余元素;也就是说,基于从
position()
到并包括limit()
-1
处的元素的元素。因为缓冲区哈希码依赖于内容,所以不建议使用缓冲区作为hash map或类似数据结构中的键,除非知道它们的内容不会改变。
-
equals
告知此缓冲区是否等于另一个对象。两个字节缓冲区相等当且仅当
它们具有相同的元素类型,
它们具有相同数量的剩余元素,并且
独立于它们的起始位置考虑的剩余元素的两个序列逐点相等。
字节缓冲区不等于任何其他类型的对象。
-
compareTo
将此缓冲区与另一个缓冲区进行比较。通过按字典顺序比较剩余元素的序列来比较两个字节缓冲区,而不考虑每个序列在其相应缓冲区中的起始位置。成对的
byte
元素就像调用Byte.compare(byte,byte)
一样进行比较。字节缓冲区无法与任何其他类型的对象相提并论。
- 指定者:
compareTo
在接口Comparable<ByteBuffer>
中- 参数:
that
- 要比较的对象。- 返回:
- 负整数、零或正整数,因为此缓冲区小于、等于或大于给定缓冲区
-
mismatch
查找并返回此缓冲区与给定缓冲区之间第一个不匹配的相对索引。该索引与每个缓冲区的position
相关,并且将在 0(含)到每个缓冲区中的remaining
元素(不包括)中较小的范围内。如果两个缓冲区共享一个公共前缀,则返回的索引是公共前缀的长度,因此两个缓冲区在各自缓冲区内的该索引处存在不匹配。如果一个缓冲区是另一个缓冲区的适当前缀,则返回的索引是每个缓冲区中剩余元素中较小的一个,因此该索引仅对剩余元素数量较多的缓冲区有效。否则,不存在不匹配。
- 参数:
that
- 要测试与此缓冲区不匹配的字节缓冲区- 返回:
- 此缓冲区与给定缓冲区之间第一个不匹配的相对索引,否则如果不匹配则为 -1。
- 自从:
- 11
-
order
检索此缓冲区的字节顺序。读取或写入多字节值时以及创建作为此字节缓冲区视图的缓冲区时,将使用字节顺序。新创建的字节缓冲区的顺序始终是
BIG_ENDIAN
。- 返回:
- 此缓冲区的字节顺序
-
order
修改此缓冲区的字节顺序。- 参数:
bo
- 新字节顺序,BIG_ENDIAN
或LITTLE_ENDIAN
- 返回:
- 这个缓冲区
-
alignmentOffset
public final int alignmentOffset(int index, int unitSize) 返回内存地址,指向给定索引处的字节,以给定的单元大小为模。返回值在
0
(含)到unitSize
(不含)范围内为非负值,零表示索引处字节的地址与单元大小对齐,正值表示地址未对齐为单位大小。如果索引处的字节地址未对齐,则返回值表示应调整多少索引才能将字节定位在对齐地址处。具体来说,如果返回值不大于index
,则索引应按返回值递减,或者按单位大小减去返回值递增。因此给出int value = alignmentOffset(index, unitSize)
alignmentOffset(index - value, unitSize) == 0, value ≤ index
alignmentOffset(index + (unitSize - value), unitSize) == 0
- API 注意:
- 如果本机平台支持,此方法可用于确定是否可以原子地访问来自索引的单位大小字节。
- 实现注意事项:
-
当给定的单元大小大于
8
时,此实现会为非直接缓冲区抛出UnsupportedOperationException
。 - 参数:
index
- 查询对齐偏移量的索引,必须为非负数,不执行上限检查unitSize
- 以字节为单位的单位大小,必须是2
的幂- 返回:
- 索引字节的内存地址以单元大小为模
- 抛出:
IllegalArgumentException
- 如果索引为负或单位大小不是2
的幂UnsupportedOperationException
- 如果在管理与此缓冲区(直接或非直接)同类缓冲区的内存区域时,本机平台不保证给定单元大小的稳定对齐偏移值。例如,如果垃圾收集会导致将非直接缓冲区覆盖的内存区域从一个位置移动到另一个位置,并且这两个位置具有不同的对齐特性。- 自从:
- 9
- 参见:
-
alignedSlice
创建一个新的字节缓冲区,其内容是此缓冲区内容的共享且对齐的子序列。新缓冲区的内容将从该缓冲区的当前位置开始,向上舍入为给定单元大小的最近对齐字节的索引,并在此缓冲区的限制处结束,向下舍入为给定单元大小的最近对齐字节的索引.如果舍入导致值超出范围,则新缓冲区的容量和限制将为零。如果舍入在范围内,则以下表达式对于新缓冲区
nb
和单元大小unitSize
为真:nb.alignmentOffset(0, unitSize) == 0 nb.alignmentOffset(nb.limit(), unitSize) == 0
对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。
新缓冲区的位置将为零,其容量和限制将为该缓冲区中剩余的字节数或更少的字节数,其标记将未定义,其字节顺序将为
BIG_ENDIAN
。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。- API 注意:
- 如果本机平台支持,此方法可用于创建新缓冲区,其中可以原子地访问来自索引的单位大小字节,即单位大小的倍数。
- 实现注意事项:
-
当给定的单元大小大于
8
时,此实现会为非直接缓冲区抛出UnsupportedOperationException
。 - 参数:
unitSize
- 以字节为单位的单位大小,必须是2
的幂- 返回:
- 新的字节缓冲区
- 抛出:
IllegalArgumentException
- 如果单位大小不是2
的幂UnsupportedOperationException
- 如果在管理与此缓冲区(直接或非直接)同类缓冲区的内存区域时,本机平台不能保证给定单元大小的稳定对齐切片。例如,如果垃圾收集会导致将非直接缓冲区覆盖的内存区域从一个位置移动到另一个位置,并且这两个位置具有不同的对齐特性。- 自从:
- 9
- 参见:
-
getChar
public abstract char getChar()相对的get读取 char 值的方法。读取此缓冲区当前位置的下两个字节,根据当前字节顺序将它们组成一个 char 值,然后将位置递增 2。
- 返回:
- 缓冲区当前位置的字符值
- 抛出:
BufferUnderflowException
- 如果此缓冲区中剩余的字节少于两个
-
putChar
相对的put写入字符值的方法(可选操作).以当前字节顺序将包含给定 char 值的两个字节写入此缓冲区的当前位置,然后将位置递增 2。
- 参数:
value
- 要写入的 char 值- 返回:
- 这个缓冲区
- 抛出:
BufferOverflowException
- 如果此缓冲区中剩余的字节少于两个ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
getChar
public abstract char getChar(int index) 绝对get读取 char 值的方法。读取给定索引处的两个字节,根据当前字节顺序将它们组合成一个 char 值。
- 参数:
index
- 将从中读取字节的索引- 返回:
- 给定索引处的字符值
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制,减一
-
putChar
绝对put写入字符值的方法(可选操作).以当前字节顺序将包含给定 char 值的两个字节写入此缓冲区中给定索引处。
- 参数:
index
- 写入字节的索引value
- 要写入的 char 值- 返回:
- 这个缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制,减一ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
asCharBuffer
创建此字节缓冲区的视图作为字符缓冲区。新缓冲区的内容将从该缓冲区的当前位置开始。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。
新缓冲区的位置将为零,其容量和限制将为该缓冲区中剩余的字节数除以二,其标记将未定义,其字节顺序将是视图显示时字节缓冲区的字节顺序创建。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。
- 返回:
- 一个新的字符缓冲区
-
getShort
public abstract short getShort()相对的get读取短值的方法。根据当前字节顺序将它们组合成一个短值,然后将位置递增 2。
- 返回:
- 缓冲区当前位置的空值
- 抛出:
BufferUnderflowException
- 如果此缓冲区中剩余的字节少于两个
-
putShort
相对的put写入短值的方法(可选操作).以当前字节顺序将包含给定短值的两个字节写入此缓冲区的当前位置,然后将位置递增 2。
- 参数:
value
- 要写入的短值- 返回:
- 这个缓冲区
- 抛出:
BufferOverflowException
- 如果此缓冲区中剩余的字节少于两个ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
getShort
public abstract short getShort(int index) 绝对get读取短值的方法。读取给定索引处的两个字节,根据当前字节顺序将它们组合成一个短值。
- 参数:
index
- 将从中读取字节的索引- 返回:
- 给定索引处的空值
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制,减一
-
putShort
绝对put写入短值的方法(可选操作).以当前字节顺序将包含给定短值的两个字节写入此缓冲区中给定索引处。
- 参数:
index
- 写入字节的索引value
- 要写入的短值- 返回:
- 这个缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制,减一ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
asShortBuffer
创建此字节缓冲区的视图作为短缓冲区。新缓冲区的内容将从该缓冲区的当前位置开始。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。
新缓冲区的位置将为零,其容量和限制将为该缓冲区中剩余的字节数除以二,其标记将未定义,其字节顺序将是视图显示时字节缓冲区的字节顺序创建。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。
- 返回:
- 一个新的短缓冲区
-
getInt
public abstract int getInt()相对的get读取 int 值的方法。读取此缓冲区当前位置的下四个字节,根据当前字节顺序将它们组成一个 int 值,然后将位置递增四。
- 返回:
- 缓冲区当前位置的 int 值
- 抛出:
BufferUnderflowException
- 如果此缓冲区中剩余的字节少于四个
-
putInt
相对的put写入int值的方法(可选操作).按当前字节顺序将包含给定 int 值的四个字节写入此缓冲区的当前位置,然后将该位置递增四。
- 参数:
value
- 要写入的 int 值- 返回:
- 这个缓冲区
- 抛出:
BufferOverflowException
- 如果此缓冲区中剩余的字节少于四个ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
getInt
public abstract int getInt(int index) 绝对get读取 int 值的方法。读取给定索引处的四个字节,根据当前字节顺序将它们组合成一个 int 值。
- 参数:
index
- 将从中读取字节的索引- 返回:
- 给定索引处的 int 值
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制,减去三
-
putInt
绝对put写入int值的方法(可选操作).以当前字节顺序将包含给定 int 值的四个字节写入此缓冲区中给定索引处。
- 参数:
index
- 写入字节的索引value
- 要写入的 int 值- 返回:
- 这个缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制,减去三ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
asIntBuffer
创建此字节缓冲区的视图作为 int 缓冲区。新缓冲区的内容将从该缓冲区的当前位置开始。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。
新缓冲区的位置将为零,其容量和限制将为该缓冲区中剩余的字节数除以四,其标记将未定义,其字节顺序将是视图显示时字节缓冲区的字节顺序创建。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。
- 返回:
- 一个新的 int 缓冲区
-
getLong
public abstract long getLong()相对的get读取长值的方法。在此缓冲区的当前位置读取接下来的八个字节,根据当前字节顺序将它们组合成一个 long 值,然后将位置递增八。
- 返回:
- 缓冲区当前位置的 long 值
- 抛出:
BufferUnderflowException
- 如果此缓冲区中剩余的字节少于八个
-
putLong
相对的put写入长值的方法(可选操作).以当前字节顺序将包含给定 long 值的八个字节写入此缓冲区的当前位置,然后将位置递增八。
- 参数:
value
- 要写入的 long 值- 返回:
- 这个缓冲区
- 抛出:
BufferOverflowException
- 如果此缓冲区中剩余的字节少于八个ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
getLong
public abstract long getLong(int index) 绝对get读取长值的方法。读取给定索引处的八个字节,根据当前字节顺序将它们组合成一个 long 值。
- 参数:
index
- 将从中读取字节的索引- 返回:
- 给定索引处的长值
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制,减去七
-
putLong
绝对put写入长值的方法(可选操作).以当前字节顺序将包含给定 long 值的八个字节写入此缓冲区中给定索引处。
- 参数:
index
- 写入字节的索引value
- 要写入的 long 值- 返回:
- 这个缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制,减去七ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
asLongBuffer
创建此字节缓冲区的视图作为长缓冲区。新缓冲区的内容将从该缓冲区的当前位置开始。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。
新缓冲区的位置将为零,其容量和限制将为该缓冲区中剩余的字节数除以八,其标记将未定义,其字节顺序将是视图显示时字节缓冲区的字节顺序创建。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。
- 返回:
- 一个新的长缓冲区
-
getFloat
public abstract float getFloat()相对的get读取浮点值的方法。在此缓冲区的当前位置读取接下来的四个字节,根据当前字节顺序将它们组成一个浮点值,然后将位置递增四。
- 返回:
- 缓冲区当前位置的浮点值
- 抛出:
BufferUnderflowException
- 如果此缓冲区中剩余的字节少于四个
-
putFloat
相对的put写入浮点值的方法(可选操作).以当前字节顺序将包含给定浮点值的四个字节写入此缓冲区的当前位置,然后将该位置递增四。
- 参数:
value
- 要写入的浮点值- 返回:
- 这个缓冲区
- 抛出:
BufferOverflowException
- 如果此缓冲区中剩余的字节少于四个ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
getFloat
public abstract float getFloat(int index) 绝对get读取浮点值的方法。读取给定索引处的四个字节,根据当前字节顺序将它们组合成一个浮点值。
- 参数:
index
- 将从中读取字节的索引- 返回:
- 给定索引处的浮点值
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制,减去三
-
putFloat
绝对put写入浮点值的方法(可选操作).以当前字节顺序将包含给定浮点值的四个字节写入此缓冲区中给定索引处。
- 参数:
index
- 写入字节的索引value
- 要写入的浮点值- 返回:
- 这个缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制,减去三ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
asFloatBuffer
创建此字节缓冲区的视图作为浮点缓冲区。新缓冲区的内容将从该缓冲区的当前位置开始。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。
新缓冲区的位置将为零,其容量和限制将为该缓冲区中剩余的字节数除以四,其标记将未定义,其字节顺序将是视图显示时字节缓冲区的字节顺序创建。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。
- 返回:
- 一个新的浮动缓冲区
-
getDouble
public abstract double getDouble()相对的get读取双精度值的方法。在此缓冲区的当前位置读取接下来的八个字节,根据当前字节顺序将它们组合成双精度值,然后将位置递增八。
- 返回:
- 缓冲区当前位置的双精度值
- 抛出:
BufferUnderflowException
- 如果此缓冲区中剩余的字节少于八个
-
putDouble
相对的put写双精度值的方法(可选操作).以当前字节顺序将包含给定双精度值的八个字节写入此缓冲区的当前位置,然后将该位置递增八。
- 参数:
value
- 要写入的双精度值- 返回:
- 这个缓冲区
- 抛出:
BufferOverflowException
- 如果此缓冲区中剩余的字节少于八个ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
getDouble
public abstract double getDouble(int index) 绝对get读取双精度值的方法。读取给定索引处的八个字节,根据当前字节顺序将它们组合成双精度值。
- 参数:
index
- 将从中读取字节的索引- 返回:
- 给定索引处的双精度值
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制,减去七
-
putDouble
绝对put写双精度值的方法(可选操作).以当前字节顺序将包含给定双精度值的八个字节写入此缓冲区中给定索引处。
- 参数:
index
- 写入字节的索引value
- 要写入的双精度值- 返回:
- 这个缓冲区
- 抛出:
IndexOutOfBoundsException
- 如果index
为负数或不小于缓冲区的限制,减去七ReadOnlyBufferException
- 如果这个缓冲区是只读的
-
asDoubleBuffer
创建此字节缓冲区的视图作为双缓冲区。新缓冲区的内容将从该缓冲区的当前位置开始。对此缓冲区内容的更改将在新缓冲区中可见,反之亦然;两个缓冲区的位置、限制和标记值将是独立的。
新缓冲区的位置将为零,其容量和限制将为该缓冲区中剩余的字节数除以八,其标记将未定义,其字节顺序将是视图显示时字节缓冲区的字节顺序创建。当且仅当此缓冲区是直接的时,新缓冲区将是直接的,并且当且仅当此缓冲区是只读的时,它将是只读的。
- 返回:
- 一个新的双缓冲区
-