JDK的ByteBuffer与Netty的ByteBuf之间的差异对比

版权声明:士,不可以不弘毅,任重而道远 https://blog.csdn.net/superbeyone/article/details/85771296


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的读写索引是完全分开的,使用起来更加方便。

猜你喜欢

转载自blog.csdn.net/superbeyone/article/details/85771296