JDK的ByteBuffer與Netty的ByteBuf之間的差異對比
阿新 • • 發佈:2019-01-04
文章目錄
JDK的ByteBuffer
與Netty的ByteBuf
之間的差異對比:
Netty
的ByteBuf
採用了讀寫索引分離的策略(readerIndex與writerIndex),一個初始化(裡面尚未有任何資料)的ByteBuf
的readerIndex與writerIndex值都為0。- 當讀索引與寫索引處於同一個位置時,如果繼續讀取,那麼就會丟擲
IndexOutOfBoundsException
- 對於
ByteBuf
的任何讀寫操作都會分別單獨維護讀索引與寫索引。maxCapacity
最大容量預設的限制時Integer.MAX_VALUE
。
JDK的ByteBuffer
的缺點:
- final byte[] hb; // Non-null only for heap buffers
這是JDK的ByteBuffer物件中用於儲存資料的物件宣告;可以看到,其位元組陣列是被宣告為final的,也就是長度時固定不變的。一旦分配好之後不能動態擴容與收縮;而且當待儲存的資料位元組很大時就很有可能出現IndexOutOfBoundsException
。如果要預防這個異常,那就需要在儲存之前完全確定好待儲存的位元組大小。如果ByteBuffer
ByteBuffer
物件,然後再將之前的ByteBuffer
的資料複製過去,這一切操作都需要由開發者自己來手動完成。 ByteBuffer
只使用一個position
指標來標識位置資訊,在進行讀寫切換時就緒啊唷呼叫flip
方法或是rewind
方法,使用起來很不方便。
Netty的ByteBuf
的優點:
- 儲存位元組的陣列時動態的,其最大值預設是
Integer.MAX_VALUE
。這裡的動態性時體現在write
方法中的,write
方法在執行時會判斷buffer
容量,如果不足則自動擴容。 ByteBuf
的讀寫索引是完全分開的,使用起來更加方便。