文档章节

Netty ByteBuf详解

robin-yao
 robin-yao
发布于 2015/04/28 23:31
字数 521
阅读 8.6K
收藏 24

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

    本文主要介绍Netty5  ByteBuf原理及具体使用。

    基本结构:与NIO ByteBuffer类似,使用ByteBuffer往往需要在读写之间通过flip切换。ByteBuf里维护两个index,一个readerIndex,一个writerIndex;readerIndex writerIndex capactiy  的三者的关系是:

    0 <=readerIndex <=writerIndex <= capacity

     当往byteBuf写入一个byte时,writerIndex++,从bytebuf读一个byte时,readerIndex++;

         

      +-------------------+------------------+------------------+
      | discardable bytes |  readable bytes  |  writable bytes  |
      |                   |     (CONTENT)    |                  |
      +-------------------+------------------+------------------+
      |                   |                  |                  |
      0      <=      readerIndex   <=   writerIndex    <=    capacity


基本操作:

    通过index随机读:

            ByteBuf byteBuf= Unpooled.buffer();
            byteBuf.writeBytes("hello world".getBytes());
            System.out.println((char)byteBuf.getByte(0));
            System.out.println((char)byteBuf.getByte(1));

 支持顺序读:满足readeableBytes>0 (writerIndex - readerIndex )

           ByteBuf byteBuf= Unpooled.buffer();
           byteBuf.writeBytes("hello world".getBytes());
           while(byteBuf.readableBytes()>0){
                System.out.println((char)byteBuf.readByte());
           }

 写操作:

        支持单个byte写入,或者直接写入byte数组;可以通过writeIndex设定writerIndex,但是如果

        writerIndex < readerIndex || writerIndex > capacity() 会抛出IndexOutOfBoundsException;

         ByteBuf byteBuf= Unpooled.buffer(50);
         while(byteBuf.writableBytes()>10){
             byteBuf.writeByte('a');
             byteBuf.writerIndex(byteBuf.writerIndex()+10);
         }
         System.out.println("writerIndex:"+byteBuf.writerIndex());
         System.out.println("readerIndex:"+byteBuf.readerIndex());
         System.out.println("index of 0 is:"+(char)byteBuf.getByte(0));
         System.out.println("index of 11 is:"+(char)byteBuf.getByte(11));
         System.out.println("index of 22 is:"+(char)byteBuf.getByte(22));
         System.out.println("index of 33 is:"+(char)byteBuf.getByte(33));
         System.out.println("index of 40 is:"+(char)byteBuf.getByte(40));
         System.out.println(new String(byteBuf.array()));

    discardReadBytes操作:

        把bytebuf中读过的byte抛弃掉,writerIndex置为writerIndex-readerIndex,readerIndex置为0;

ByteBuf byteBuf= Unpooled.buffer();
byteBuf.writeBytes("hello world".getBytes());
System.out.println("readerIndex:" + byteBuf.readerIndex());
System.out.println("writerIndex:" + byteBuf.writerIndex());
System.out.println((char)byteBuf.readByte());
System.out.println(new String(byteBuf.array()));
 byteBuf.discardReadBytes();
System.out.println("readerIndex:" + byteBuf.readerIndex());
System.out.println("writerIndex:" + byteBuf.writerIndex());
System.out.println(new String(byteBuf.array()));

    clear mark reset 操作:

        clear把bytebuf 的writerIndex=readerindex=0;

        mark把当前的writerIndex或者readerIndex mark一下,记录到私有变量中

        reset把当前的writerIndex或者readerIndex恢复到mark的index;

 ByteBuf byteBuf= Unpooled.buffer();
 byteBuf.writeBytes("hello world".getBytes());
 System.out.println(new String(byteBuf.array()));
 System.out.println("readerIndex:" + byteBuf.readerIndex());
 System.out.println("writerIndex:" + byteBuf.writerIndex());
   byteBuf.clear();
  System.out.println("after clear");
  System.out.println("readerIndex:" + byteBuf.readerIndex());
  System.out.println("writerIndex:" + byteBuf.writerIndex());
  System.out.println(new String(byteBuf.array()));
  byteBuf.writerIndex(11);
 
   byteBuf.readByte();
   //在index 为1时mark ,reset之后重新回到mark的地方        
   byteBuf.markReaderIndex();
   byteBuf.readByte();
   byteBuf.readByte();
   byteBuf.resetReaderIndex();
   System.out.println("readerIndex:" + byteBuf.readerIndex());

    Netty中分配ByteBuf有两种方式,一个是Pooled 池化的,一个是Unpooled 非池化的。

Unpooled类封装了UnpooledByteBufAllocator,用来初始化ByteBuf 包含Heap类型和Direct类型的。

PooledByteBufAllocator用来分配池化的ByteBuf,重复利用ByteBuf数组,减少分配回收开销。

同时Buffer模块还提供方便的工具类ByteBufUtil来操作ByteBuf。


END--------------------------------------------

转发标注来源:http://my.oschina.net/robinyao/blog/407469

© 著作权归作者所有

robin-yao
粉丝 168
博文 54
码字总数 61436
作品 0
杭州
私信 提问
加载中

评论(0)

《Netty Zookeeper Redis 高并发实战》 图书简介

《Netty Zookeeper Redis 高并发实战》 图书简介 <font size=3 face="黑体" > 本书为 高并发社群 —— 疯狂创客圈 倾力编著, 高度剖析底层原理,深度解读面试难题<font size=3 face="黑体"......

osc_0jbt10ev
2019/08/22
13
0
netty之ByteBuf详解

【ChannelPromise作用:可以设置success或failure 是为了通知ChannelFutureListener】 Netty的数据处理API通过两个组件暴露——abstract class ByteBuf和interface ByteBufHolder。 下面是一...

osc_vh89klm7
2019/05/27
3
0
Netty 核心容器之ByteBuf 结构详解

<div><img src="http://pic.zhoutao123.com/wecaht/wechaticon2.png" style="width:500px"></div> 👆关注微信公众号,获取更多编程内容 <hr/> 原文链接 Netty 核心容器之ByteBuf 结构详解 ......

osc_7c6h7z9p
2019/04/05
2
0
源码之下无秘密 ── 做最好的 Netty 源码分析教程

背景 在工作中, 虽然我经常使用到 Netty 库, 但是很多时候对 Netty 的一些概念还是处于知其然, 不知其所以然的状态, 因此就萌生了学习 Netty 源码的想法. 刚开始看源码的时候, 自然是比较痛苦...

永顺
2017/11/29
0
0
第五章:Buffers(缓冲)

本章介绍 ByteBuf ByteBufHolder ByteBufAllocator 使用这些接口分配缓冲和执行操作 每当你需要传输数据时,它必须包含一个缓冲区。Java NIO API自带的缓冲区类是相当有限的,没有经过优化,...

李矮矮
2016/09/23
53
0

没有更多内容

加载失败,请刷新页面

加载更多

数据倾斜

数据倾斜: 两种数据倾斜发生的现象: 80%情况下都发生挂了,只有极少20%情况下能把task执行完成 窄依赖:结构简单,如果发生数据丢失,方便查找丢失的数据 宽依赖:结构复杂,如何发生数据丢...

七宝1
57分钟前
20
0
我的jdk源码(十一):ArrayList

一、概述 ArrayList类是AbstractList的子类,实现了具体的add(), set(), remove()等方法。它是一个可调整大小的数组可以用来存放各种形式的数据。 二、源码分析 (1) 类的声明,源码如下: ...

Java觉浅
昨天
24
0
vnc server,vnc server是什么,vnc工具推荐

nc server是一个用来共享linux服务器上资源给其他分布式用户的服务只要再一台linux系统的机器上安装vnc server,然后开启服务,其他机器就可以通过vncviewer访问这台机器上的共享资源,那么今...

兔子m
昨天
20
0
COLA的扩展性使用和源码研究

cola扩展点使用和设计初探 封装变化,可灵活应对程序的需求变化。 扩展点使用 步骤: 定义扩展点接口,类型可以是校验器,转换器,实体; 必须以ExtPt结尾,表示一个扩展点。 比如,我定义一个...

李福春carter
昨天
27
0
0、MySql第零章,安装及集群配置

MySql第零章,安装及集群配置 一、MySql安装 1、RPM安装 RPM安装,无法自定义一些安装路径和配置文件路径 ##以后再填坑 2、Generic安装 二进制 预编译 Generic,下载地址: https://cdn.m...

有一个小阿飞
昨天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部