基本用法 - 使用 DirectByteBuffer
DirectByteBuffer
是 ByteBuffer
的特殊实现,没有 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 支持 。