|
|||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
java.nio
类 ByteBuffer
java.lang.Object java.nio.Buffer java.nio.ByteBuffer
- 所有已实现的接口:
- Comparable<ByteBuffer>
- 直接已知子类:
- MappedByteBuffer
-
public abstract class ByteBuffer
- extends Buffer
- implements Comparable<ByteBuffer>
字节缓冲区。
此类针对字节缓冲区定义了以下六类操作:
将此缓冲区的连续字节序列传输到数组中的相对
批量 get
方法;
将字节数组或其他字节缓冲区中的连续字节序列传输到此缓冲区的相对
批量 put
方法;
创建视图缓冲区 的方法,这些方法允许将字节缓冲区视为包含其他基本类型值的缓冲区;
对字节缓冲区进行
compacting
、
duplicating
和
slicing
的方法。
字节缓冲区可以通过 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)
voidputFloat(float f)
voidputFloat(int index, float f)
并针对 char、short、int、long 和 double 等类型定义了相应的方法。绝对 get 和 put 方法的 index 参数是根据字节定义的,而不是根据所读写的类型定义的。
为了访问同类二进制数据(即相同类型的值的序列),此类还定义了可以为指定类型的缓冲区创建视图 的方法。视图缓冲区 只是其内容受该字节缓冲区支持的另一种缓冲区。字节缓冲区内容的更改在视图缓冲区中是可见的,反之亦然;这两种缓冲区的位置、限制和标记值都是独立的。例如,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
方法摘要 | |
---|---|
static ByteBuffer |
allocate(int capacity) 分配一个新的字节缓冲区。 |
static ByteBuffer |
allocateDirect(int capacity) 分配新的直接字节缓冲区。 |
byte[] |
array() 返回实现此缓冲区的字节数组(可选操作)。 |
int |
arrayOffset() 返回此缓冲区中的第一个元素在缓冲区的底层实现数组中的偏移量(可选操作)。 |
abstract CharBuffer |
asCharBuffer() 创建此字节缓冲区的视图,作为 char 缓冲区。 |
abstract DoubleBuffer |
asDoubleBuffer() 创建此字节缓冲区的视图,作为 double 缓冲区。 |
abstract FloatBuffer |
asFloatBuffer() 创建此字节缓冲区的视图,作为 float 缓冲区。 |
abstract IntBuffer |
asIntBuffer() 创建此字节缓冲区的视图,作为 int 缓冲区。 |
abstract LongBuffer |
asLongBuffer() 创建此字节缓冲区的视图,作为 long 缓冲区。 |
abstract ByteBuffer |
asReadOnlyBuffer() 创建共享此缓冲区内容的新的只读字节缓冲区。 |
abstract ShortBuffer |
asShortBuffer() 创建此字节缓冲区的视图,作为 short 缓冲区。 |
abstract ByteBuffer |
compact() 压缩此缓冲区(可选操作)。 |
int |
compareTo(ByteBuffer that) 将此缓冲区与另一个缓冲区进行比较。 |
abstract ByteBuffer |
duplicate() 创建共享此缓冲区内容的新的字节缓冲区。 |
boolean |
equals(Object ob) 判断此缓冲区是否与另一个对象相同。 |
abstract byte |
get() 相对 get 方法。 |
ByteBuffer |
get(byte[] dst) 相对批量 get 方法。 |
ByteBuffer |
get(byte[] dst, int offset, int length) 相对批量 get 方法。 |
abstract byte |
get(int index) 绝对 get 方法。 |
abstract char |
getChar() 用于读取 char 值的相对 get 方法。 |
abstract char |
getChar(int index) 用于读取 char 值的绝对 get 方法。 |
abstract double |
getDouble() 用于读取 double 值的相对 get 方法。 |
abstract double |
getDouble(int index) 用于读取 double 值的绝对 get 方法。 |
abstract float |
getFloat() 用于读取 float 值的相对 get 方法。 |
abstract float |
getFloat(int index) 用于读取 float 值的绝对 get 方法。 |
abstract int |
getInt() 用于读取 int 值的相对 get 方法。 |
abstract int |
getInt(int index) 用于读取 int 值的绝对 get 方法。 |
abstract long |
getLong() 用于读取 long 值的相对 get 方法。 |
abstract long |
getLong(int index) 用于读取 long 值的绝对 get 方法。 |
abstract short |
getShort() 用于读取 short 值的相对 get 方法。 |
abstract short |
getShort(int index) 用于读取 short 值的绝对 get 方法。 |
boolean |
hasArray() 判断是否可通过一个可访问的字节数组实现此缓冲区。 |
int |
hashCode() 返回此缓冲区的当前哈希码。 |
abstract boolean |
isDirect() 判断此字节缓冲区是否为直接的。 |
ByteOrder |
order() 检索此缓冲区的字节顺序。 |
ByteBuffer |
order(ByteOrder bo) 修改此缓冲区的字节顺序。 |
abstract ByteBuffer |
put(byte b) 相对 put 方法(可选操作)。 |
ByteBuffer |
put(byte[] src) 相对批量 put 方法(可选操作)。 |
ByteBuffer |
put(byte[] src, int offset, int length) 相对批量 put 方法(可选操作)。 |
ByteBuffer |
put(ByteBuffer src) 相对批量 put 方法(可选操作)。 |
abstract ByteBuffer |
put(int index, byte b) 绝对 put 方法(可选操作)。 |
abstract ByteBuffer |
putChar(char value) 用来写入 char 值的相对 put 方法(可选操作)。 |
abstract ByteBuffer |
putChar(int index, char value) 用于写入 char 值的绝对 put 方法(可选操作)。 |
abstract ByteBuffer |
putDouble(double value) 用于写入 double 值的相对 put 方法(可选操作)。 |
abstract ByteBuffer |
putDouble(int index, double value) 用于写入 double 值的绝对 put 方法(可选操作)。 |
abstract ByteBuffer |
putFloat(float value) 用于写入 float 值的相对 put 方法(可选操作)。 |
abstract ByteBuffer |
putFloat(int index, float value) 用于写入 float 值的绝对 put 方法(可选操作)。 |
abstract ByteBuffer |
putInt(int value) 用于写入 int 值的相对 put 方法(可选操作)。 |
abstract ByteBuffer |
putInt(int index, int value) 用于写入 int 值的绝对 put 方法(可选操作)。 |
abstract ByteBuffer |
putLong(int index, long value) 用于写入 long 值的绝对 put 方法(可选操作)。 |
abstract ByteBuffer |
putLong(long value) 用于写入 long 值(可先操作) 的相对 put 方法。 |
abstract ByteBuffer |
putShort(int index, short value) 用于写入 short 值的绝对 put 方法(可选操作)。 |
abstract ByteBuffer |
putShort(short value) 用于写入 short 值的相对 put 方法(可选操作)。 |
abstract ByteBuffer |
slice() 创建新的字节缓冲区,其内容是此缓冲区内容的共享子序列。 |
String |
toString() 返回汇总了此缓冲区状态的字符串。 |
static ByteBuffer |
wrap(byte[] array) 将字节数组包装到缓冲区中。 |
static ByteBuffer |
wrap(byte[] array, int offset, int length) 将字节数组包装到缓冲区中。 |
从类 java.nio.Buffer 继承的方法 |
---|
capacity, clear, flip, hasRemaining, isReadOnly, limit, limit, mark, position, position, remaining, reset, rewind |
从类 java.lang.Object 继承的方法 |
---|
clone, finalize, getClass, notify, notifyAll, wait, wait, wait |
方法详细信息 |
---|
allocateDirect
public static ByteBuffer allocateDirect(int capacity)
-
分配新的直接字节缓冲区。
新缓冲区的位置将为零,其界限将为其容量,其标记是不确定的。无论它是否具有
底层实现数组
,其标记都是不确定的。
-
-
- 参数:
-
capacity
- 新缓冲区的容量,以字节为单位 - 返回:
- 新的字节缓冲区
- 抛出:
-
IllegalArgumentException
- 如果 capacity 为负整数
allocate
public static ByteBuffer allocate(int capacity)
- 分配一个新的字节缓冲区。
-
-
- 参数:
-
capacity
- 新缓冲区的容量,以字节为单位 - 返回:
- 新的字节缓冲区
- 抛出:
-
IllegalArgumentException
- 如果 capacity 为负整数
wrap
public static ByteBuffer wrap(byte[] array, int offset, int length)
-
将字节数组包装到缓冲区中。
新的缓冲区将由给定的字节数组支持;也就是说,缓冲区修改将导致数组修改,反之亦然。新缓冲区的容量将为 array.length,其位置将为 offset,其界限将为 offset + length,其标记是不确定的。其
底层实现数组
将为给定数组,并且其
数组偏移量
将为零。
-
-
- 参数:
-
array
- 支持新缓冲区的数组 -
offset
- 要使用的子数组的偏移量;必须为非负且不大于 array.length。将新缓冲区的位置设置为此值。 -
length
- 要使用的子数组的长度;必须为非负且不大于 array.length - offset。将新缓冲区的界限设置为 offset + length。 - 返回:
- 新的字节缓冲区
- 抛出:
-
IndexOutOfBoundsException
- 如果关于 offset 和 length 参数的前提不成立
wrap
public static ByteBuffer wrap(byte[] array)
-
将字节数组包装到缓冲区中。
新的缓冲区将由给定的字节数组支持;也就是说,缓冲区修改将导致数组修改,反之亦然。新缓冲区的容量和界限将为 array.length,其位置将为零,其标记是不确定的。其
底层实现数组
将为给定数组,并且其
数组偏移量
将为零。
-
-
- 参数:
-
array
- 实现此缓冲区的数组 - 返回:
- 新的字节缓冲区
slice
public abstract ByteBuffer slice()
-
创建新的字节缓冲区,其内容是此缓冲区内容的共享子序列。
新缓冲区的内容将从此缓冲区的当前位置开始。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。
新缓冲区的位置将为零,其容量和界限将为此缓冲区中所剩余的字节数量,其标记是不确定的。当且仅当此缓冲区为直接时,新缓冲区才是直接的,当且仅当此缓冲区为只读时,新缓冲区才是只读的。
-
-
- 返回:
- 新的字节缓冲区
duplicate
public abstract ByteBuffer duplicate()
-
创建共享此缓冲区内容的新的字节缓冲区。
新缓冲区的内容将为此缓冲区的内容。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。
新缓冲区的容量、界限、位置和标记值将与此缓冲区相同。当且仅当此缓冲区为直接时,新缓冲区才是直接的,当且仅当此缓冲区为只读时,新缓冲区才是只读的。
-
-
- 返回:
- 新的字节缓冲区
asReadOnlyBuffer
public abstract ByteBuffer asReadOnlyBuffer()
-
创建共享此缓冲区内容的新的只读字节缓冲区。
新缓冲区的内容将为此缓冲区的内容。此缓冲区内容的更改在新缓冲区中是可见的,但新缓冲区将是只读的并且不允许修改共享内容。两个缓冲区的位置、界限和标记值是相互独立的。
新缓冲区的容量、界限、位置和标记值将与此缓冲区相同。
如果此缓冲区本身是只读的,则此方法与
duplicate
方法完全相同。 -
-
- 返回:
- 新的只读字节缓冲区