Netty入门(四)ByteBuf 字节级别的操作
Netty 中使用 ByteBuf 代替 Java NIO 提供的 ByteBuffer 作为字节的容器。
一、索引
ByteBuf 提供两个指针变量支持读和写操作,读操作使用 readerIndex,写操作使用 writerIndex。如下图:

- 可丢弃字节,因为它们已经被读
- 可读字节,已写入但还没有被读取
- 可写字节
二、索引管理
- 调用 markReaderIndex(), markWriterIndex(), resetReaderIndex() 和 resetWriterIndex() 来设置和重新定位 readerIndex 和 writerIndex,
- 调用 readerIndex(int) 或 writerIndex(int) 将指针移动到指定的位置
- 调用 clear() 同时设置 readerIndex 和 writerIndex 为 0
三、查询操作
可以使用以 ByteBufProcessor 为参数的方法,下面例子实现了寻找一个回车符( \r ):
ByteBuf in = (ByteBuf)msg;
int index = in.forEachByte(ByteProcessor.FIND_CR);
四、衍生的缓冲区
slice 方法和 copy 方法都能实现拷贝功能,但是它们有不同之处,下面两个例子说明了它们的不同之处。
先看看 slice 的例子:
Charset utf8 = Charset.forName("UTF-8");
ByteBuf buf = Unpooled.copiedBuffer("Netty in Action rocks!", utf8);
ByteBuf sliced = buf.slice(0, 14); // 创建从0开始到14的新slice
System.out.println(sliced.toString(utf8)); //打印 Netty in Action
buf.setByte(0, (byte) 'J'); //更新索引为0的字节
// 断言成功,说明slice之后两段数据共享
assert buf.getByte(0) == sliced.getByte(0);
这个说明 slice 返回的是原缓冲区的一个副本,共享同一片数据。因此若需要操作某段数据,使用 slice 方法。
下面来看看 copy 方法是如何不同的:
Charset utf8 = Charset.forName("UTF-8");
ByteBuf buf = Unpooled.copiedBuffer("Netty in Action rocks!", utf8);
ByteBuf copy = buf.copy(0, 14); // 注意这里使用了copy
System.out.println(copy.toString(utf8));
buf.setByte(0, (byte) 'J');
// 断言成功,说明原数据修改对copy不影响
assert buf.getByte(0) != copy.getByte(0);
可以看到,代码几乎是相同的,但所衍生的 ByteBuf 效果是不同的。
五、读 / 写操作
读 / 写操作主要有两类:
- get() / set() 操作:从给定的索引开始,写索引和读索引保持不变
- read() / write() 操作:从给定的索引开始,根据字节访问的数量,递增当前的写索引或读索引。
需要特别注意上述两类操作对于读索引和写索引的影响。
常见的 get() 操作如下:

常见的 set() 操作如下:

常见的 read() 操作如下:

每个 read() 方法都对应一个 write() 方法,如下:

六、更多操作
还有一些比较常用的方法如下:

Netty入门(四)ByteBuf 字节级别的操作的更多相关文章
- 网络编程Netty入门:ByteBuf分析
目录 Netty中的ByteBuf优势 NIO使用的ByteBuffer有哪些缺点 ByteBuf的优势和做了哪些增强 ByteBuf操作示例 ByteBuf操作 简单的Demo示例 堆内和堆外内存 ...
- 数据库操作事物的四大特性以及MySQL数据库的四种隔离级别
1 .事物操作数据库的四大特性(ACID) 1.原子性 (Atomicity) 原子性:就是事物的所包含的所有操作,要么全部成功,要么全部失败回滚. 2.一致性 (Consistency) 一致性:简 ...
- Netty入门与实战教程总结分享
前言:都说Netty是Java程序员必须要掌握的一项技能,带着不止要知其然还要知其所以然的目的,在慕课上找了一个学习Netty源码的教程,看了几章后着实有点懵逼.虽然用过Netty,并且在自己的个人网 ...
- Netty入门
一.NIO Netty框架底层是对NIO的高度封装,所以想要更好的学习Netty之前,应先了解下什么是NIO - NIO是non-blocking的简称,在jdk1.4 里提供的新api,他的他的特性 ...
- netty入门(一)
1. netty入门(一) 1.1. 传统socket编程 在任何时候都可能有大量的线程处于休眠状态,只是等待输入或者输出数据就绪,这可能算是一种资源浪费. 需要为每个线程的调用栈都分配内存,其默认值 ...
- Netty入门教程——认识Netty
什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架. Netty 是一个广泛使用的 Java 网络编程框架(N ...
- Java网络编程 -- Netty入门
Netty简介 Netty是一个高性能,高可扩展性的异步事件驱动的网络应用程序框架,它极大的简化了TCP和UDP客户端和服务器端网络开发.它是一个NIO框架,对Java NIO进行了良好的封装.作为一 ...
- Netty入门(1) - 简介
什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架. Tomcat和Netty有什么区别? Netty和Tom ...
- Netty入门1之----认识Netty
Netty 什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架. Netty 是一个广泛使用的 Java ...
随机推荐
- 深入贯彻闭包思想,全面理解JS闭包形成过程
谈起闭包,它可是JavaScript两个核心技术之一(异步和闭包),在面试以及实际应用当中,我们都离不开它们,甚至可以说它们是衡量js工程师实力的一个重要指标.下面我们就罗列闭包的几个常见问题,从回答 ...
- 深入理解.NET MemoryCache
摘要 MemoryCache是.Net Framework 4.0开始提供的内存缓存类,使用该类型可以方便的在程序内部缓存数据并对于数据的有效性进行方便的管理,借助该类型可以实现ASP.NET中常用的 ...
- 2.C#知识点:I/O
一.什么是I/0流? 英文翻译:Input/Output,在程序里简单的理解为读写数据操作数据的意思.流操作是为了解决体积大数据占用太多的内存,就是分段进行操作.就跟我们吃饭一样,一口一口的吃,还没见 ...
- Java面试题阶段汇总
初级面试题 Java面试题-基础篇一 Java面试题-基础篇二 Java面试题-集合框架篇三 Java面试题-基础篇四 Java面试题-基础篇五 Java面试题-javaweb篇六 Java面试题 ...
- java.lang.ExceptionInInitializerError异常
今天在开发的过程中,遇到java.lang.ExceptionInInitializerError异常,百度查了一下,顺便学习学习,做个笔记 静态初始化程序中发生意外异常的信号,抛出Exception ...
- python3.8 新特性
https://docs.python.org/3.8/whatsnew/3.8.html python 3.8的新功能本文解释了与3.7相比,python 3.8中的新特性. 有关完整的详细信息,请 ...
- luogu P4108 [HEOI2015]公约数数列——solution
-by luogu 不会啊.... 然后%了一发题解, 关键是 考虑序列{$a_n$}的前缀gcd序列, 它是单调不升的,且最多只会改变$log_2N$次,因为每变一次至少除2 于是,当我们询问x时: ...
- Java基础笔记(1) 语言 JAVA的历史 Java的搭建环境
本文除了搭建是重点,其他的都当阅读小说一样去看就好了,不想看可以直接抓住重点,我会改变颜色勾出重点! 英语是人与人交流沟通的重要方式之一.JAVA:是人与计算机沟通交流重要方式之一.我们除了用java ...
- 图像矫正-基于opencv实现
一.引言 上篇文章中四种方法对图像进行倾角矫正都非常有效.Hough变换和Radon相似,其抗干扰能力比较强,但是运算量大,程序执行慢,其改进方法为:我们可以不对整幅图像进行操作,可以在图像中选取一块 ...
- 开源项目管理工具KanBoard
KanBoard是一个很好用的项目管理软件,地址点此.它以网页形式存储在服务器或者本地,支持多标签.多项目.多用户和多种显示方式.编辑方式上支持markdown.它还提供多角度可视化的项目统计分析. ...