美文网首页
netty的bytebuf总结

netty的bytebuf总结

作者: lazyguy | 来源:发表于2018-01-11 16:07 被阅读0次

title: netty的bytebuf总结
date: 2017-02-10 10:59:41
tags:
category: netty


java原生api ByteBuffer的弊端

1.ByteBuffer长度固定,一旦分配完成,它的容量不能动态扩展和收缩,当需要编码的POJO对象大于ByteBuffer的容量时,会发生索引越界异常;

2.ByteBuffer只有一个标识位置的指针position,读写的时候需要手工调用flip()和rewind()等,使用者必须小心谨慎地处理这些API,否则很容易导致程序处理失败;

3.api复杂,功能简单。netty的ByteBuff提供了更多灵活的api。

@Test
public void testByteBuffer() throws Exception {
    ByteBuffer byteBuffer = ByteBuffer.allocate(100);
    byteBuffer.put("我是一些内容".getBytes());

    byteBuffer.flip();
    byte[] container = new byte[byteBuffer.remaining()];
    byteBuffer.get(container);
    System.out.println(new String(container));

}

这是一个经典的

分配一个100字节的bytebuffer,放入字节内容。(注意你是不能超过100字节的,尝试放入更长的内容会溢出,因为底层就是一个平平无奇的字节数组)

然后flip()将limit置于实际内容之后。如果你没做这一步,或者顺序不对,放后面去了,都会报错。

因为后面的api会读到数组里面没有放内容的部分。

然后按bytebuffer返回的remaining内容的大小,创建一个数组。读内容进去。再转码变成想要的。

可以看出这样用其实很细节,底层和琐碎……

netty将底层的postion指针,重设计为读写两个分开的Index。

netty的ByteBuf的实现是底层相当于将Bytebuffer底层的position分开2个,一个readerIndex,一个writerIndex.这样读写的时候避免了不停的flip和rewind。

netty可以自动进行容量检查,扩容,简化了write系列的api使用

将上面的

ByteBuffer byteBuffer = ByteBuffer.allocate(100);

修改为2个字节。运行将抛出java.nio.BufferOverflowException异常

很明显,Bytebuffer不会自动扩容。但是ByteBuff的api会自动检查不超过最大缓存的前提下自动扩容。避免手动检查。

netty的discardReadBytes()

这个方法可以释放已经读过的数据,如果不调用,会造成缓冲扩容,浪费内存。但是调用之后,底层会进行内存复制,将可写的数组空间放在一起。所以会有性能损失。2者间的权衡需要注意。

相关文章

网友评论

      本文标题:netty的bytebuf总结

      本文链接:https://www.haomeiwen.com/subject/ayqtoxtx.html