netty的——byteBuffer

因为之后想要做一个基于UDP实现可靠传输的项目,但是java网络编程的基础不是很好,所以学一下Netty来补齐一下基础。今天是byteBuffer。

在Java nio中,主要有三大组件:Buffer,Channel和Selector。Buffer提供了一个字节缓冲区,其可以不断的从Channel中读取接收到的数据。

特点:

  1. 大小不可变。一旦创建,无法改变其容量大小,无法扩容或者缩容;
  2. 读写灵活。内部通过指针移动来实现灵活读写;
  3. 支持堆上内存分配和直接内存分配。 

属性主要有如图下四个,关于mark需要注意

  1. positionlimit一旦小于markmark会被丢弃;
  2. 没有定义mark时如果调用了Buffer#reset则会抛出InvalidMarkException

byteBuffer使用很简单:

  1. allocate(int capacity): 分配新的字节缓冲区。

    ByteBuffer buffer = ByteBuffer.allocate(10);

  2. wrap(byte[] array): 包装一个现有的字节数组,创建一个新的字节缓冲区。

    byte[] byteArray = new byte[10];

    ByteBuffer buffer = ByteBuffer.wrap(byteArray);

  3. put(byte b): 将字节写入缓冲区的当前位置。

    ByteBuffer buffer = ByteBuffer.allocate(10);

    buffer.put((byte) 65); // 写入ASCII码为65的字节'A'

  4. put(byte[] src): 将字节数组写入缓冲区。

    ByteBuffer buffer = ByteBuffer.allocate(10);

    byte[] byteArray = {65, 66, 67}; // 'A', 'B', 'C'

    buffer.put(byteArray);

  5. get(): 读取缓冲区的当前位置的字节。

    ByteBuffer buffer = ByteBuffer.allocate(10);

    buffer.put((byte) 65);

    buffer.flip(); // 切换到读取模式(必须,不然读不出来的)

    byte result = buffer.get(); // 读取字节

  6. get(byte[] dst): 将缓冲区的字节读取到给定的字节数组中。

    ByteBuffer buffer = ByteBuffer.allocate(10);

    buffer.put((byte) 65);

    buffer.flip();

    byte[] byteArray = new byte[1];

    buffer.get(byteArray); // 读取字节到字节数组

  7. flip(): 切换缓冲区的读取/写入模式。

    ByteBuffer buffer = ByteBuffer.allocate(10);

    buffer.put((byte) 65);

    buffer.flip(); // 切换到读取模式

  8. clear(): 清空缓冲区,但是数据仍然存在,处于"forgotten but not gone"状态。

    ByteBuffer buffer = ByteBuffer.allocate(10);

    buffer.put((byte) 65);

    buffer.flip();

    buffer.clear(); // 清空缓冲区,准备写入

  9. compact(): 将缓冲区中未读取的数据复制到缓冲区的开始位置,然后将位置设置为复制数据的末尾。(注意这个方法,读过的数据会被清除,如果要反复读取,参考rewind方法)

    ByteBuffer buffer = ByteBuffer.allocate(10);

    buffer.put((byte) 65);

    buffer.flip();

    buffer.get(); // 读取一个字节

    buffer.compact(); // 将未读取的数据复制到缓冲区的开始位置

  10. remaining(): 返回当前位置与限制之间(limit,见上图)的元素数量。

    ByteBuffer buffer = ByteBuffer.allocate(10);

    buffer.put((byte) 65);

    buffer.flip();

    int remaining = buffer.remaining(); // 返回1,因为只有一个字节未读取

还有很多方法,没办法一次性列举, 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值