Netty Associated -- ByteBuf

ByteBuf

ByteBuf是Netty的Server与Client之间通信的数据传输载体.他提供了一个byte数组(byte[])的抽象视图

buffer创建

我们推荐通过一个Unpooled的帮助方法来创建新的buffer而不是通过调用独立的构造器来创建

随机访问索引

就像普通的原声字节数组一样, ByteBuf使用零基坐标(zero-based indexing). 这表示第一个字节的坐标总是0, 最后一个字节的坐标总是capacity - 1.例如, 要遍历buffer的所有字节,你可以按下面这样做:

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

连续访问索引

ByteBuf提供了两个指针变量来支持顺序读写操作 - readerIndex用来支持读操作, writerIndex用来支持写操作.下面的表格显示了一个buffer是如何通过两个指针分段为三部分的

可读字节(真实内容)

这个段是真实数据储存的地方.任何名字以start或skip开始的操作都会增加当前readerIndex他读过的字节数.如果读操作的参数也是一个ByteBuf, 并且没有指定目的地坐标, 那么指定ByteBuf的writerIndex也会一起增加

如果buf没有足够的内容可供读取,会抛出IndexOutOfBoundsException. 最新分配的buffer, buffer的包装类和副本的readerIndex默认值都是0

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

可写字节

这个段是一个等待被填满的未定义空间.任何名字已write结尾的操作都会在当前writerIndex上写入数据,并且将writerIndex的值增加写入的数据数.如果写入操作的参数也是一个ByteBuf, 并且没有元坐标被指定, 那么指定的buffer的readerIndex也会一起增加

如果没有组合够的空间剩余来写,会抛出IndexOutOfBoundsException. 最新分配的buffer的writerIndex的默认值是0, 包装类和buffer副本的writerIndex是buffer的容量

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

 丢弃字节

这个段包含已经被读操作读过的字节.初始化的时候, 这个段的大小为0,这个段的大小会随着读操作一直增加到writerIndex.读字节可以通过discardReadBytes()回收未被使用的区域将其变为丢弃字节, 如下图所示

 

调用discardReadBytes()前:

 

使用discardReadBytes()后:

请注意并不能保证在调用discardReadBytes()后并不能保证可写字节的内容.可写字节在大部分情况下不会移动, 并且可能被完全不同的数据填满, 这取决于底层的buffer实现.

 

清除buffer索引

你可以通过调用clear()将readerIndex和writerIndex都设为0.这不会清除buffer内容(例如用0填充), 他仅仅是清除了两个指针.请注意这个操作的语义和ByteBuffer.clear()是不一样的

clear()前

clear()后

 

搜索操作

使用indexOf(int, int, byte)和bytesBefore(int, int, byte)可以进行最简单的单字节搜索.bytesBefore(byte)在你处理一个NUL-terminated字符串的时候特别有用.更复杂的搜索, 请使用forEachByte(int, int, ByteBufProcessor)和一个ByteBufProcessor的实现

 

标记和重置

每个buffer都有两个标记索引.一个用来保存readerIndex,另一个用来保存writerIndex.你可以通过调用reset()放来来重置他们中的一个.他的工作方式和InputStream中的mark和reset方法很像, 只是没有readlimit

 

派生buffer

你可以通过调用duplicate(), slice()或者slice(int, int)来创建一个已存在的buffer的视图.一个派生的buffer会有单独的readerIndex,writerIndex和标记坐标, 但是他共享其他数据.就像一个NIO的buffer一样.

加入你需要一个全新的buffer的copy,请调用copy()方法

 

转化为已存在的JDK类型

Byte array

假如一个ByteBuf是有一个byte数组作为支持的, 你可以直接通过array()方法访问它. 判断一个buffer是否是被byte array作为支持,调用hasArray()

只有堆内内存的ByteBuf是有array支持的, 如果是堆外内存的ByteBuf, 是不能通过array()获取到数据的, 而CompositeByteBuf可能由堆内的ByteBuf和堆外的DirectByteBuf组成, 他也不能直接通过array()获取数据

 

NIO Buffers

如果一个ByteBuf可以被转换为NIO ByteBuffer, 他共享他的内容,你可以通过nioBuffer()获取它.判断一个buffer能否被转化为NIO buffer, 使用nioBufferCount().

 

Strings

各种各样的toString(Charset)方法将一个ByteBuf转化为一个String.请注意toString()并不是一个转换方法.

 

I/O Streams

请看ByteBufInputStream和ByteBufOutputStream

转载于:https://www.cnblogs.com/zemliu/p/3375000.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 根号2计算过程,根号2以及π的计算--关于无理数的畅想

[导读]这两篇文章里&#xff0c;我发现不需要那些老师教的范式也能很好地理解那些现代概念&#xff0c;并且理解的更深刻。这两篇文章里&#xff0c;我发现不需要那些老师教的范式也能很好地理解那些现代概念&#xff0c;并且理解的更深刻。我一般假设自己从来没有学过微积分&a…

oracle对象权限 函数,oracle的系统和对象权限

alter any cluster 修改任意簇的权限alter any index 修改任意索引的权限alter any role 修改任意角色的权限alter any sequence 修改任意序列的权限alter any snapshot 修改任意快照的权限alter any table 修改任意表的权限alter any trigger 修改任意触发器的权限alter clust…

批处理程序实例

一、交互界面设计 没啥说的&#xff0c;看看高手设计的菜单界面吧&#xff1a;echo offclstitle 终极多功能修复:menuclscolor 0Aecho.echo echo 请选择要进行的操作&#xff0c;然后按回车echo echo.echo 1.网络修复及上网相关设置,修复IE,自定义屏蔽网站echo.echo 2.病毒专杀…

oracle 10g dsg,【ORACLE】relink oracle 10g 数据库

通常要迁移一个数据库&#xff0c;我们会使用1 冷备份&#xff0c;整个数据库迁移&#xff0c;2 rman duplicate 功能进行复制到本机或者复制到异机&#xff0c;前面两种都必须先在目标库上安装软件。这里测试另外一种方法&#xff1a;对于单实例数据库&#xff0c;复制整个ora…

任务分配与时间估计

各成员的任务分配与时间估计如下&#xff1a; 项目所需总时间为&#xff1a; 转载于:https://www.cnblogs.com/buaa-smile/p/3383374.html

vbs 连oracle 负载均衡,(原)QTP中用VBS调用PLSQL并执行相关语句

今天工作的需求是要在录制一段web程序之前要调用plsql并执行一段数据库代码清空相关数据才能做web录制测试&#xff0c;本来是想用QTP直接录制plsql的&#xff0c;但是后来发现自己对qtp录制window application并不是很了解&#xff0c;选定了 Automation菜单下的Record and Ru…

unity中发布android时候出现这样的提示错误:error:device not found

原因很简单&#xff0c;就是你没开启安卓设备&#xff0c;无论是安卓手机还是安卓虚拟器。。 解决办法&#xff1a;只要开启安卓虚拟器或者连接手机即可 再次打开cmd命令窗口&#xff0c;找到apk文件所在路径&#xff0c;例如&#xff1a; D: 回车&#xff08;我的是在d盘根目录…

Oracle 每个session的限制,限制oracle普通用户能且只能kill自己的会话

声明&#xff1a;仅用于测试环境方便调试&#xff0c;不可能应用于生产环境&#xff1b;故请勿加入到程序源代码来实现自动杀进程。只需一个参数&#xff0c;就能kill用户自己的会话&#xff0c;请小心操作&#xff0c;以免误kill进程。使用方法&#xff1a;新开一个session后&…

Hessian简介

Hessian Hessian是一个轻量级的remoting onhttp工具&#xff0c;使用简单的方法提供了RMI的功能。 相比WebService&#xff0c;Hessian更简单、快捷。采用的是二进制RPC协议&#xff0c;因为采用的是二进制协议&#xff0c;所以它很适合于发送二进制数据目 录 1介绍 1.1 注意事…

linux 以某个用户执行,Linux root用户肿么以制定的用户去执行某个程序。

chmod o-x m1说明&#xff1a;命令格式&#xff1a;chmod [options] mode files只能文件属主或特权用户才能使用该功能来改变文件存取模式。mode可以是数字形式或以who opcode permission形式表示。who是可选的&#xff0c;默认是a(所有用户)。只能选择一个opcode(操作码)。可指…

linux启动sh文件命令,Linux下如何写 .sh 脚本启动 项目

Linux下如何写 .sh 脚本启动 项目创建文件 mealcoupon.sh内容如下&#xff1a;#!/bin/bash#这里可替换为你自己的执行程序&#xff0c;其他代码无需更改APP_NAMExhqy_yzf-1.0.0.war#项目的路径(替换成你项目的路径)PROJECT_LOCATION/home/xpro/xhqy_jt#使用说明&#xff0c;用…

[wikioi]奇怪的梦境

http://wikioi.com/problem/2833/ 拓扑排序&#xff0c;居然1A&#xff0c;哈哈。 #include <cstdio> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <memory.h> #define MAX(a, b) a>b?a:b…

linux所有用户无法登录用户名和密码错误,为什么linux登录不了啊,用户名和密码都没问题,就是出现这个,有高手指点一下。...

为什么linux登录不了啊&#xff0c;用户名和密码都没问题&#xff0c;就是出现这个&#xff0c;有高手指点一下。关注:121 答案:6 mip版解决时间 2021-02-04 23:27提问者删除记忆里的你2021-02-04 04:27最佳答案二级知识专家那年夏天2021-02-04 05:19用户名肯定是root&#x…

Notes of the scrum meeting(2013/10/23)

ps&#xff1a;本来是10月23号周三下午开的会&#xff0c;这几天由于各种事情忙&#xff0c;忘记写博客了&#xff0c;现在补上。 软工项目组buaa_smile开始项目第一次scrum meeting meeting time:4:00~5:00p.m.,October 23th,2013 meeting place:主M202 attendees: 顾育豪 …

linux查用户的家目录,详解Linux误删用户家目录的恢复方法

在生产中可能会由于误操作而删除了某一用户的家目录&#xff0c;这时就需要把用户的家目录安装创建新用户时的模板文件&#xff0c;再恢复并且要跟之前的权限相同。1. 创建一个新的用户用于测试[rootcentos6 aubin]# useradd wangcai2. 新用户创建完成时会在/home下面自动创建同…

linux spring mvc tomcat配置,Spring MVC配置详解

一、Spring MVC处理流程1.Spring MVC将所有请求都交由DispatchServlet进行处理。2.DispatchServlet获取HandlerMapping(处理映射器)&#xff0c;然后找到对应的HandlerBean处理Controller请求&#xff0c;并返回一个ModelAndView对象。3.DispatchServlet查询一个或多个ViewReso…

这段时

这段时间通过与大家一起努力与研究&#xff0c;用新的技术框架重新构建了某集团销售统计系统。在这里总结一下项目心得。 技术—— EasyUI更好前端设计&#xff0c;通过json生成相应UI组件。并且风格统一大方&#xff0c;比较好的支持异步调用。MVC更好的将显示与控制分离&…

如何在linux里面运行ncl,NCL基础讲解(二)——NCL安装与运行

NCL基础讲解(二)——NCL安装与运行兰溪之水2015-11-04上一期已经给大家简单介绍了NCL的基本情况&#xff0c;既然NCL在科学数据分析和可视化方面有那么多优点&#xff0c;那还等什么&#xff0c;让我们一起“用”起来吧&#xff01;这一期给大家介绍NCL的安装与运行。关于NCL的…