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