文档章节

Netty ByteBuf详解

robin-yao
 robin-yao
发布于 2015/04/28 23:31
字数 521
阅读 1067
收藏 24
点赞 1
评论 0

    本文主要介绍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
粉丝 148
博文 54
码字总数 61496
作品 0
杭州
dubbo中的那些“坑"(3)-netty4-rpc网络接口中的高并发的bug

在几个月前改造dubbo时,netty4已经稳定很久了,一时手痒,按照netty3-rpc的源码克隆了一套netty4,在修正了大量的包、类型不同之后,基本保持了netty3的风格,并发量小或者数据包很小时,一...

阿阮 ⋅ 2014/12/02 ⋅ 10

源码之下无秘密 ── 做最好的 Netty 源码分析教程

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

永顺 ⋅ 2017/11/29 ⋅ 0

第五章:Buffers(缓冲)

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

李矮矮 ⋅ 2016/09/23 ⋅ 0

Netty精粹之玩转NIO缓冲区

在JAVA NIO相关的组件中,ByteBuffer是除了Selector、Channel之外的另一个很重要的组件,它是直接和Channel打交道的缓冲区,通常场景或是从ByteBuffer写入Channel,或是从Channel读入Buffer;...

Float_Luuu ⋅ 2016/03/13 ⋅ 0

对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解

根据 Wiki 对 Zero-copy 的定义: "Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. This is fre......

永顺 ⋅ 2017/11/29 ⋅ 0

Netty in Action ——— ByteBuf

本文是Netty文集中“Netty in action”系列的文章。主要是对Norman Maurer and Marvin Allen Wolfthal 的 《Netty in action》一书简要翻译,同时对重要点加上一些自己补充和扩展。 本章含盖...

tomas家的小拨浪鼓 ⋅ 2017/11/06 ⋅ 0

netty io.netty.buffer简介

io.netty.util.ReferenceCounted 此接口代表一个引用计数的对象,此对象需要显示的释放. 当一个对象被实例化的时候,该对象的引用数量就是1,调用方法会增加引用数量,调用 方法会减少引用数...

andyyuan5546 ⋅ 2015/08/11 ⋅ 0

Netty Buffer

Netty高性能很大原因在于Netty Buffer的设计,Netty Buffer由Nio Buffer而来,并对Nio Buffer做了改进。首先,Netty Buffer的“零拷贝”特性使得Netty Buffer的性能十分优越;还有Netty内存池...

AaronSheng ⋅ 2016/10/15 ⋅ 0

Netty版本升级及线程模型详解

作者 李林锋 发布于 2015年2月7日 | 注意:GTLC全球技术领导力峰会,500+CTO技聚重新定义技术领导力!18 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件分享 稍后阅读 我的阅读清单 1....

tantexian ⋅ 2016/07/06 ⋅ 0

Netty之有效规避内存泄漏

有过痛苦的经历,特别能写出深刻的文章 —— 凯尔文. 肖 直接内存是IO框架的绝配,但直接内存的分配销毁不易,所以使用内存池能大幅提高性能。但,要重新培养被Java的自动垃圾回收惯坏了的惰...

Mr_Young ⋅ 2015/08/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部