ChannelBuffer是Netty中比较常用的一个类,其功能类似于字符数组,可以对其进行读写操作。

ChannelBuffer的模型图如下:

+-------------------+------------------+------------------+
 | discardable bytes |  readable bytes  |  writable bytes  |
 |                   |     (CONTENT)    |                  |
 +-------------------+------------------+------------------+
 |                   |                  |                  |

0      <=      readerIndex   <=   writerIndex    <=    capacity

如上图所示,一个ChannelBuffer被划分为三个部分:

1.discardable:表示已经读过的内容缓冲区

2.readable:表示可读的内容缓冲区

3.writable:表示可写的内容缓冲区

ChannelBuffer的这三个缓冲区由2个内部控制指针来控制:

readerIndex:控制读缓冲区首地址

writerIndex:控制写缓冲区首地址

因此,ChannelBuffer提供的大部分操作都是围绕readerIndex和writerIndex来进行的。

ChannelBuffer的常用方法如下:

1、

read()/skip()

从readerIndex读出或跳过指定数目的字节,同时readerIndex = readerIndex + byteNumber.如果readerIndex > capacity,表示读取下标越界,会抛出

IndexOutOfBoundsException异常

readable():boolean

如果buffer有可读内容(此时writerIndex > readerIndex),则返回true,否则返回false

readerIndex():int

返回readerIndex

readableBytes():int

返回可读的字节数目(writerIndex - readerIndex)

2、

write();

写入指定数目的字节,同时writerIndex = writerIndex + byteNumber. 如果writerIndex > capacity,表示写入下标越界,会抛出

IndexOutOfBoundsException异常

writable():boolean

如果buffer有可写入空间(此时writerIndex < capacity),则返回true,否则返回false。

writerIndex(): int

返回writerIndex

writeableIndex():int
返回可写入的字节数(capacity - writerIndex)。

3、discardReadBytes()

丢弃已读的内容。其执行过程如下:

调用discardReadBytes()之前:

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

调用 discardReadBytes()方法后

+------------------+--------------------------------------+
|  readable bytes  |    writable bytes (got more space)   |
+------------------+--------------------------------------+
|                  |                                      |
readerIndex (0) <= writerIndex (decreased)    <=      capacity

4、clear()
丢弃所有的数据,并将readerIndex和writerIndex重置为0。

调用clear()之前
 +-------------------+------------------+------------------+
 | discardable bytes |  readable bytes  |  writable bytes  |
 +-------------------+------------------+------------------+
 |                   |                  |                  |
 0      <=      readerIndex   <=   writerIndex    <=    capacity

调用clear()之后

+---------------------------------------------------------+ |             
                 writable bytes (got more space)             |
 +---------------------------------------------------------+ |                                                         |
0 = readerIndex = writerIndex            <=            capacity

5、

markReaderIndex()
markWriterIndex()

保存readerIndex或writerIndex的状态

6、

resetReaderIndex()

resetWriterIndex()

重置readerIndex或writerIndex为最后一次保存的状态,如果没有保存过,则置为0

7、

duplicate()

slice()

拷贝和源目标共享buffer的数据区域,但是拷贝有自己的readerIndex和writerIndex以及markIndex,实际上只是拷贝了控制指针,数据区还是与源buffer共享。

8、

copy()

拷贝整个buffer,包括控制指针和数据区

测试代码如下:

package test;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;

public class ChannelBufferTest {

/**
     *
     * @author lengxue
     * @date 11 Jul 2012 09:05:10
     * @param args
     * @note
     */
    public static void main( String[] args ) {
        // TODO Auto-generated method stub
        ChannelBuffer buffer = ChannelBuffers.buffer( 10 );
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));
        
        buffer.writeInt( 10 );
        System.out.println("after write one integer");
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));

buffer.writeInt( 10 );
        System.out.println("after write two integer");
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));
        
        int i = buffer.readInt( );
        System.out.println("after read one integer: " + i);
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));
        
        buffer.discardReadBytes( );
        System.out.println("after discard read bytes");
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));
        
        buffer.resetReaderIndex( );
        System.out.println("after reset reader index");
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));
        
        buffer.resetWriterIndex( );
        System.out.println("after reset writer index");
        System.out.println("readable bytes: " + buffer.readableBytes( ));
        System.out.println("readable index: " + buffer.readerIndex( ));
        System.out.println("writable bytes: " + buffer.writableBytes( ));
        System.out.println("writable index: " + buffer.writerIndex( ));
    }

}

结果输出如下:

readable bytes: 0
readable index: 0
writable bytes: 10
writable index: 0
after write one integer
readable bytes: 4
readable index: 0
writable bytes: 6
writable index: 4
after write two integer
readable bytes: 8
readable index: 0
writable bytes: 2
writable index: 8
after read one integer: 10
readable bytes: 4
readable index: 4
writable bytes: 2
writable index: 8
after discard read bytes
readable bytes: 4
readable index: 0
writable bytes: 6
writable index: 4
after reset reader index
readable bytes: 4
readable index: 0
writable bytes: 6
writable index: 4
after reset writer index
readable bytes: 0
readable index: 0
writable bytes: 10

writable index: 0

Netty ChannelBuffer相关推荐

  1. 发布一个基于 Reactor 模式的 C++ 网络库

    发布一个基于 Reactor 模式的 C++ 网络库 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 Aug 30 本文主要介绍 muduo 网 ...

  2. 《Linux多线程服务端编程:使用muduoC++网络库》学习笔记

    文章目录 第1章 线程安全的对象生命期管理 1.1 当析构函数遇到多线程 1.1.1 线程安全的定义 1.1.3 线程安全实例 1.2 对象的创建很简单 1.3 销毁很难 1.4 线程安全的Obser ...

  3. muduo网络库:18---muduo简介之(muduo库的由来、编译安装、目录结构、代码结构、线程模型)

    一.由来 2010年3月陈硕先生写了一篇<学之者生,用之者死--ACE历史与简评>(文章参阅:https://blog.csdn.net/Solstice/article/details/ ...

  4. netty里集成spring注入mysq连接池(一)

    netty的性能非常高,能达到8000rps以上,见 各个web服务器的性能对比测试 1.准备好需要的jar包 spring.jar            //spring包 netty-3.2.4. ...

  5. Netty、Kafka中的零拷贝技术到底有多牛?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:rrd.me/ggFBd 零拷贝,从字面意思理解就是数据不需 ...

  6. 深入探秘 Netty、Kafka 中的零拷贝技术!

    作者:ksfzhaohui 原文:juejin.im/post/5cad6f1ef265da039f0ef5df 零拷贝,从字面意思理解就是数据不需要来回的拷贝,大大提升了系统的性能.我们也经常在 J ...

  7. Netty源码解析1-Buffer

    大数据成神之路系列: 请戳GitHub原文: github.com/wangzhiwubi- 更多文章关注:多线程/集合/分布式/Netty/NIO/RPC Java高级特性增强-集合 Java高级特 ...

  8. netty之ObjectSizeEstimator

    2019独角兽企业重金招聘Python工程师标准>>> 今天测试netty,之前一直会出现阻塞,最后测试服务器所有线程挂起,最后无法正常工作, ExecutionHandler,   ...

  9. Netty深入浅出(一)入门

    传统Socket中,NIO和IO的比较(Nio知识回顾) IO 阻塞点: server.accept(); 和 单线程情况下只能有一个客户端 用线程池可以有多个客户端连接,但是非常消耗性能 NIO s ...

  10. Netty详解(四):Netty 整体架构

    1. 概述 Netty是JBoss出品的高效的Java NIO开发框架,本文将主要分析Netty实现方面的东西. Netty总体架构图: 2. Buffer org.jboss.netty.buffe ...

最新文章

  1. jQuery 选择器汇总-思维导图-选择器
  2. 【转】Hibernate和IBatis对比
  3. 牛客题霸 SQL5 查找所有员工的last_name和first_name以及对应部门编号dept_no
  4. 有向加权图 最大弱连通分支_买入加权组合式等价对敲
  5. 18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?
  6. b - 数据结构实验之查找二:平衡二叉树_文件系统的灵魂数据结构 B树
  7. EasyUI---layout布局、树形组件、选项卡tabs
  8. Eclipse自动部署项目到Tomcat的webapps下的有效方法
  9. edge chrome Android,微软Edge浏览器安卓版已上架:采用Chrome引擎
  10. 惠普T5325 惠普T5565 惠普T5400 瘦客机评测
  11. 摄像机成像原理(模型)与标定
  12. Exception in thread “main“ java.nio.file.NoSuchFileException: 123.txt
  13. 设计冲刺案例|谷歌设计冲刺用4天确定热卖智能相机Clips的功能特性
  14. codelite开发php,C++跨平台开发环境(CodeLite)
  15. SQL SERVE 2008远程连接 提示sqlserver远程主机强迫关闭了一个现有连接
  16. 目前最赚钱快的微信营销几种玩法和模式
  17. 属鸡适不适合学计算机,生肖属相鸡适宜什么职业(详解)
  18. r720支持多少频率的内存吗_内存条全面选购指南,2020年有哪些内存条值得推荐...
  19. 「从 Windows 到 macOS」快速理顺两大系统之间的差异
  20. logback中logger的 additivity 属性

热门文章

  1. 12C RAC中的一个数据库实例自动crash并报ORA-27157、ORA-27300等错误
  2. Java字符串首字母大写
  3. win8蓝屏错误代码DPC_WATCHDOG_VIOLATION您的电脑遇到错误需要重启修复
  4. [Python]关键字is和操作符==
  5. 技巧:linux开机自动启动脚本(转)
  6. C# 基础-CLR-类型【0】
  7. childNodes.length 的临时保存
  8. Codeforces - 570D 离散DFS序 特殊的子树统计 (暴力出奇迹)
  9. Androidstudio加载工程很慢解决方案
  10. 开启A20线(部分译)