1. 程式人生 > >JDK的ByteBuffer與Netty的ByteBuf之間的差異對比

JDK的ByteBuffer與Netty的ByteBuf之間的差異對比

文章目錄


JDK的ByteBuffer與Netty的ByteBuf之間的差異對比:

  1. NettyByteBuf採用了讀寫索引分離的策略(readerIndex與writerIndex),一個初始化(裡面尚未有任何資料)的ByteBuf的readerIndex與writerIndex值都為0。
  2. 當讀索引與寫索引處於同一個位置時,如果繼續讀取,那麼就會丟擲IndexOutOfBoundsException
  3. 對於ByteBuf的任何讀寫操作都會分別單獨維護讀索引與寫索引。maxCapacity最大容量預設的限制時Integer.MAX_VALUE

JDK的ByteBuffer的缺點:

  1. final byte[] hb; // Non-null only for heap buffers
    這是JDK的ByteBuffer物件中用於儲存資料的物件宣告;可以看到,其位元組陣列是被宣告為final的,也就是長度時固定不變的。一旦分配好之後不能動態擴容與收縮;而且當待儲存的資料位元組很大時就很有可能出現IndexOutOfBoundsException。如果要預防這個異常,那就需要在儲存之前完全確定好待儲存的位元組大小。如果ByteBuffer
    的空間不足,我們只有一種解決方案:建立一個全新的ByteBuffer物件,然後再將之前的ByteBuffer的資料複製過去,這一切操作都需要由開發者自己來手動完成。
  2. ByteBuffer只使用一個position指標來標識位置資訊,在進行讀寫切換時就緒啊唷呼叫flip方法或是rewind方法,使用起來很不方便。

Netty的ByteBuf的優點:

  1. 儲存位元組的陣列時動態的,其最大值預設是Integer.MAX_VALUE。這裡的動態性時體現在write方法中的,write方法在執行時會判斷buffer容量,如果不足則自動擴容。
  2. ByteBuf的讀寫索引是完全分開的,使用起來更加方便。