基本用法 - 使用 DirectByteBuffer

DirectByteBufferByteBuffer 的特殊实现,没有 byte[] 在下面铺设。

我们可以通过调用来分配这样的 ByteBuffer:

ByteBuffer directBuffer = ByteBuffer.allocateDirect(16);

此操作将分配 16 个字节的内存。直接缓冲区的内容可能位于正常的垃圾收集堆之外。

我们可以通过调用来验证 ByteBuffer 是否是直接的:

directBuffer.isDirect(); // true

DirectByteBuffer 的主要特点是 JVM 将尝试在没有任何额外缓冲的情况下本地处理已分配的内存,因此对其执行的操作可能比在具有位于下面的阵列的 ByteBuffers 上执行的操作更快。

建议使用 DirectByteBuffer 进行大量 IO 操作,这些操作依赖于执行速度,如实时通信。

我们必须要知道,如果我们尝试使用 array() 方法,我们将得到 UnsupportedOperationException。因此,在我们尝试访问它之前,先了解我们的 ByteBuffer 是否有它(字节数组)是一个好习惯:

 byte[] arrayOfBytes;
 if(buffer.hasArray()) {
     arrayOfBytes = buffer.array();
 }

直接字节缓冲区的另一个用途是通过 JNI 进行互操作。由于直接字节缓冲区不使用 byte[],而是使用实际的内存块,因此可以通过本机代码中的指针直接访问该内存。这可以节省 Java 和本机数据表示之间的编组的麻烦和开销。

JNI 接口定义了几个处理直接字节缓冲区的函数: NIO 支持