基本用法 - 使用 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 支援