`
san_yun
  • 浏览: 2600461 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

ChannelBuffer介绍介绍

 
阅读更多

A random and sequential accessible sequence of zero or more bytes (octets). This interface provides an abstract view for one or more primitive byte arrays (byte[] ) and  NIO buffers .

Creation of a buffer

It is recommended to create a new buffer using the helper methods in  ChannelBuffers   rather than calling an individual implementation's constructor.

Random Access Indexing

Just like an ordinary primitive byte array,  ChannelBuffer   uses  zero-based indexing . It means the index of the first byte is always  0   and the index of the last byte is always  capacity - 1 . For example, to iterate all bytes of a buffer, you can do the following, regardless of its internal implementation:

 ChannelBuffer buffer = ...;
 for (int i = 0; i < buffer.capacity(); i ++) {
     byte b = array.getByte(i);
     System.out.println((char) b);
 }
 

Sequential Access Indexing

ChannelBuffer   provides two pointer variables to support sequential read and write operations -  readerIndex   for a read operation and  writerIndex   for a write operation respectively. The following diagram shows how a buffer is segmented into three areas by the two pointers:

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

Readable bytes (the actual content)

This segment is where the actual data is stored. Any operation whose name starts with  read   or  skip   will get or skip the data at the current  readerIndex   and increase it by the number of read bytes. If the argument of the read operation is also a  ChannelBuffer   and no destination index is specified, the specified buffer's  readerIndex   is increased together.

If there's not enough content left,  IndexOutOfBoundsException   is raised. The default value of newly allocated, wrapped or copied buffer's  readerIndex   is  0 .

 // Iterates the readable bytes of a buffer.
 ChannelBuffer buffer = ...;
 while (buffer.readable()) {
     System.out.println(buffer.readByte());
 }
 

Writable bytes

This segment is a undefined space which needs to be filled. Any operation whose name ends with  write   will write the data at the current  writerIndex   and increase it by the number of written bytes. If the argument of the write operation is also a  ChannelBuffer , and no source index is specified, the specified buffer's  readerIndex   is increased together.

If there's not enough writable bytes left,  IndexOutOfBoundsException   is raised. The default value of newly allocated buffer's  writerIndex   is  0 . The default value of wrapped or copied buffer's  writerIndex   is the  capacity   of the buffer.

 // Fills the writable bytes of a buffer with random integers.
 ChannelBuffer buffer = ...;
 while (buffer.writableBytes() >= 4) {
     buffer.writeInt(random.nextInt());
 }
 

Discardable bytes

This segment contains the bytes which were read already by a read operation. Initially, the size of this segment is  0 , but its size increases up to the  writerIndex   as read operations are executed. The read bytes can be discarded by callingdiscardReadBytes()   to reclaim unused area as depicted by the following diagram:

  BEFORE discardReadBytes()

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


  AFTER discardReadBytes()

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

Please note that there is no guarantee about the content of writable bytes after calling  discardReadBytes() . The writable bytes will not be moved in most cases and could even be filled with completely different data depending on the underlying buffer implementation.

Clearing the buffer indexes

 You can set both  readerIndex   and  writerIndex   to  0   by calling  clear() . It does not clear the buffer content (e.g. filling with  0 ) but just clears the two pointers. Please also note that the semantic of this operation is different fromByteBuffer.clear() .

  BEFORE clear()

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


  AFTER clear()

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

Search operations

Various  indexOf()   methods help you locate an index of a value which meets a certain criteria. Complicated dynamic sequential search can be done with  ChannelBufferIndexFinder   as well as simple static single byte search.

Mark and reset

There are two marker indexes in every buffer. One is for storing  readerIndex   and the other is for storing  writerIndex . You can always reposition one of the two indexes by calling a reset method. It works in a similar fashion to the mark and reset methods in  InputStream   except that there's no  readlimit .

Derived buffers

You can create a view of an existing buffer by calling either  duplicate() ,  slice()   or  slice(int, int) . A derived buffer will have an independent  readerIndex ,  writerIndex   and marker indexes, while it shares other internal data representation, just like a NIO buffer does.

In case a completely fresh copy of an existing buffer is required, please call  copy()   method instead.

Conversion to existing JDK types

NIO Buffers

Various  toByteBuffer()   and  toByteBuffers()   methods convert a  ChannelBuffer   into one or more NIO buffers. These methods avoid buffer allocation and memory copy whenever possible, but there's no guarantee that memory copy will not be involved or that an explicit memory copy will be involved.

Strings

Various  toString(String)   methods convert a  ChannelBuffer   into a  String . Please note that  toString()   is not a conversion method.

I/O Streams

Please refer to  ChannelBufferInputStream   and  ChannelBufferOutputStream .

 

分享到:
评论

相关推荐

    netty pojo 文档

    netty pojo netty pojo替换 channelbuffer

    netty3.1中文用户手册.pdf

    序言 1 1. 问题 1 2. 方案 2 第一章 . 开始 2 1.1. 开始之前 3 1.2. 抛弃协议服务 3 1.3. 查看接收到的数据 5 ...1.8. 使用 POJO 代替 ChannelBuffer 15 1.9. 关闭你的应用 18 1.10. 总述 21 第二章 . 架构总览 22

    node-v0.10.13-sunos-x86.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    课设毕设基于SSM的高校二手交易平台-LW+PPT+源码可运行.zip

    课设毕设基于SSM的高校二手交易平台--LW+PPT+源码可运行

    软件设计师讲义.md

    软件设计师讲义.md

    时间序列预测,股票方向应用,使用transformer-lstm融合的模型算法

    适用人群 针对有一定机器学习和深度学习背景的专业人士,特别是那些对时间序列预测和Transformer以及LSTM模型有兴趣的人。需要一定的Python知识基础 适用场景 用于处理时间序列数据,尤其是在金融领域,示例是股票价格预测。Transformer模型和LSTM的混合使用表明,代码的目的是利用这两种模型的优势来提高预测准确性。 目标 代码的主要目标是利用Transformer模型和LSTM模型来预测时间序列数据,如股票价格。通过实现这两种模型,代码旨在提供一个强大的工具来进行更准确的时间序列分析和预测。

    Autojs-PJYSDK-泡椒云网络验证-v1.15.zip

    Autojs-PJYSDK-泡椒云网络验证-v1.15.zip

    nodejs-ia32-0.10.20.tgz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Java项目之jspm足球俱乐部网上商城系统(源码 + 说明文档)

    Java项目之jspm足球俱乐部网上商城系统(源码 + 说明文档) 第二章 技术介绍 5 2.1 结构简介 5 2.2MySQL 介绍 5 2.3MySQL环境配置 5 2.4Java语言简介 6 2.5JSP技术 7 2.6 SSM框架 7 第三章 系统分析与设计 9 3.1系统说明 9 3.2系统可行性分析 9 3.2.1技术可行性 9 3.2.2经济可行性 9 3.2.3操作可行性 10 3.2.4运行可行性 10 3.3系统的设计思想 10 3.4系统功能结构 11 3.5系统流程分析 12 3.5.1操作流程 12 3.5.2添加信息流程 13 3.5.3删除信息流程 14 第四章 数据库设计 15 4.1数据库概念设计 15 4.2数据表设计 16 第五章 系统的详细设计 23 5.1系统首页的设计 23 5.2后台功能模块 25 5.2.1管理员功能模块 25 5.2.2用户功能模块 27 第六章 系统测试 29 6.1系统测试方法 29 6.2系统功能测试 29

    2024年第九届数维杯数学建模挑战赛题目.rar

    2024年第九届数维杯数学建模挑战赛题目.rar

    springboot(火车站订票管理系统)

    开发语言:Java JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.6/5.7(或8.0) 数据库工具:Navicat 开发软件:idea 依赖管理包:Maven 代码+数据库保证完整可用,可提供远程调试并指导运行服务(额外付费)~ 如果对系统的中的某些部分感到不合适可提供修改服务,比如题目、界面、功能等等... 声明: 1.项目已经调试过,完美运行 2.需要远程帮忙部署项目,需要额外付费 3.本项目有演示视频,如果需要观看,请联系我v:19306446185 4.调试过程中可帮忙安装IDEA,eclipse,MySQL,JDK,Tomcat等软件 重点: 需要其他Java源码联系我,更多源码任你选,你想要的源码我都有! https://img-blog.csdnimg.cn/direct/e73dc0ac8d27434b86d886db5a438c71.jpeg

    springboot(英语知识应用网站)

    开发语言:Java JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.6/5.7(或8.0) 数据库工具:Navicat 开发软件:idea 依赖管理包:Maven 代码+数据库保证完整可用,可提供远程调试并指导运行服务(额外付费)~ 如果对系统的中的某些部分感到不合适可提供修改服务,比如题目、界面、功能等等... 声明: 1.项目已经调试过,完美运行 2.需要远程帮忙部署项目,需要额外付费 3.本项目有演示视频,如果需要观看,请联系我v:19306446185 4.调试过程中可帮忙安装IDEA,eclipse,MySQL,JDK,Tomcat等软件 重点: 需要其他Java源码联系我,更多源码任你选,你想要的源码我都有! https://img-blog.csdnimg.cn/direct/e73dc0ac8d27434b86d886db5a438c71.jpeg

    node-v0.8.27-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v0.11.7-sunos-x86.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    【课程设计】实现的金融风控贷款违约预测python源码.zip

    【课程设计】实现的金融风控贷款违约预测python源码.zip

    Java面向对象综合实验,实现拼图游戏.zip

    游戏的最终成品展示,然后再一步一步的从0开始,完成游戏里面每一个细节。 游戏运行之后,就是这样的界面。 刚开始打开,是登录页面,因为是第一次运行,需要注册。点击注册就会跳转到注册页面 在注册页面我们可以注册账号,用户名如果已存在则会注册失败。 在游戏主界面中,我们可以利用上下左右移动小图片去玩游戏,还有快捷键A可以查看最终效果,W一键通关。 我们在写游戏的时候,也是一部分一部分完成的。 先写游戏主界面,实现步骤如下: 1,完成最外层窗体的搭建。 2,再把菜单添加到窗体当中。 3,把小图片添加到窗体当中。 4,打乱数字图片的顺序。 5,让数字图片可以移动起来。 6,通关之后的胜利判断。 7,添加其他额外的功能。

    学位英语复习资料 学位英语复习资料

    学位英语复习资料

    1plusx_1_proj_test_231125_答案.zip

    1plusx_1_proj_test_231125_答案.zip

    人工智能+深度学习+深度学习数学基础+整理完整版

    【项目资源】:汇聚了云计算、区块链、网络安全、前端设计、后端架构、UI/UX设计、游戏开发、移动应用开发、虚拟现实(VR)、增强现实(AR)、3D建模与渲染、云计算服务、网络安全工具等各类技术项目的素材和模板。包括AWS、Azure、Docker、Kubernetes、React、Vue、Angular、Node.js、Django、Flask、Unity、Unreal Engine、Blender、Sketch、Figma、Wireshark、Nmap等项目的素材和模板。【项目质量】:所有素材和模板都经过精心筛选和整理,确保满足专业标准。在发布前,我们已经对功能进行了全面测试,确保其稳定性和可用性。【适用人群】:适合对技术充满热情的初学者、希望提升专业技能的中级开发者、以及寻求创新解决方案的高级工程师。无论是个人项目、团队合作、课程设计还是商业应用,都能在这里找到合适的资源。【附加价值】:这些项目资源不仅具有很高的学习价值,而且能够直接应用于实际项目中,提高开发效率。对于有志于深入研究或拓展新领域的人来说,它们提供了丰富的灵感和基础框架,帮助你快速构建出令人惊艳的作品。

    课设毕设基于SSM的人才公寓管理系统-LW+PPT+源码可运行.zip

    课设毕设基于SSM的人才公寓管理系统--LW+PPT+源码可运行

Global site tag (gtag.js) - Google Analytics