AIO系列文档(1)----图解ByteBuffer
因何而写
网上关于bytebuffer的文章真的很多,为何在此还要写一篇呢?主要是基于以下几点考虑
- 很多人在使用t-io时,还不会bytebuffer,只会照着t-io提供的例子照猫画虎,不利于灵活运用
- 网上搜到的一些相关文章,讲得不是太易懂,不利于初学者灵活运用bytebuffer
- 本文旨在讲解灵活运用bytebuffer所需的最小知识,以帮助用户快速掌握bytebuffer
用极易的方式认识一下bytebuffer
bytebuffer之第一眼印象
我们可以把bytebuffer理解成如下几个成员组成的一个新对象,对,就是一个普通的java对象,像string一样的java对象。(强调一下,这里只是说这样理解,实际上有些bytebuffer的实现类并非这样实现,并且这里只列出掌握bytebuffer所需要的最小知识集合,其它诸如mark等字段本文并不介绍,以免增加初学者的惑度)
- byte[] bytes: 用来存储数据
- int capacity: 用来表示bytes的容量,那么可以想像capacity就等于bytes.size(),此值在初始化bytes后,是不可变的。
- int limit: 用来表示bytes实际装了多少数据,可以容易想像得到limit <= capacity,此值是可灵活变动的
- int position: 用来表示在哪个位置开始往bytes写数据或是读数据,此值是可灵活变动的
通过下图,对bytebuffer形成一个感观认识吧
bytebuffer之常用操作及各操作对内部变量带来的变化
创建bytebuffer: ByteBuffer.allocate(6)
写入一个字节: byteBuffer.put((byte)3)
读取一个字节: byte bs = byteBuffer.get()
对于刚刚写好的bytebuffer,我们要读取它的内容,需要先设置一下position和limit,否则读的位置就不对
byteBuffer.position(0); //设置position到0位置,这样读数据时就从这个位置开始读 byteBuffer.limit(1); //设置limit为1,表示当前bytebuffer的有效数据长度是1
我们看一下,设置position和limit后,bytebuffer的内部变化
接下来,我们就可以读取刚才写入的数据了
byte bs = byteBuffer.get();
bytebuffer之使用心得
这里说的是作者本人使用bytebuffer的一些心得,这些与其说是心得,不如说是实践+测试得来的一些经验,所以并不保证就是权威的,欢迎有更深研究的朋友来合理讨论,如果有不同意见,可以以更好的论据来说服对方。
合理灵活运用HeapByteBuffer.array()
HeapByteBuffer.array()返回的是其内部byte[],我们拿到这个后,就可以随意对这个byte[]随便操作了,可以参考t-io的SendRunnable.java的下面这段代码
ByteBuffer allByteBuffer = ByteBuffer.allocate(allBytebufferCapacity); byte[] dest = allByteBuffer.array(); for (ByteBuffer byteBuffer : byteBuffers) {if (byteBuffer != null) { int length = byteBuffer.limit(); int position = allByteBuffer.position(); System.arraycopy(byteBuffer.array(), 0, dest, position, length); allByteBuffer.position(position + length); } }
注意:DirectBuffer内部是没有byte[]的,也就没有所谓的byte[]操作了。
jdk自带的bytebuffer已经足够好用
有一些nio/aio框架喜欢自己弄一套bytebuffer来,既增加了作者自己的工作量,又增加了用户的学习成本,但我们要知道一点,nio/aio在发送数据时,最终的参数是jdk的bytebuffer,我们真的有必要再作一次转换和计算吗?尽管某些中间过程是“零拷贝”(这个“零拷贝”也是有额外的计算成本的)的,但是jdk版bytebuffer的诞生到发送完毕,这整个过程经历了哪些操作呢?真的是如某书某博客上所说的“零拷贝”吗?更不应该把某些对象池的做法也牵强附会到“零拷贝”的概念中来----对象池属对象重复利用范畴,既然是重复利用自然便已经默认有零拷贝的属性了,但是对象池本身的维护也是需要消耗资源的,所以并不是所有场景说用了对象池,性能就提升了,有时候用不好反而增加负担,所以万事要以测试数据为准,不应盲目人云亦云!
最后附上bytebuffer的示例程序
这里附上bytebuffer的示例程序,用户可以自己debug观察观察,增加bytebuffer的相关概念,以便更灵活的运用bytebuffer
import java.nio.ByteBuffer;/*** @author tanyaowu * 2017年5月1日 上午9:00:50 */ public class Ts { /** * * @author: tanyaowu */ public Ts() { } /** * @param args * @author: tanyaowu */ public static void main(String[] args) { ByteBuffer byteBuffer = ByteBuffer.allocate(6); byteBuffer.put((byte)3); byteBuffer.position(0); //设置position到0位置,这样读数据时就从这个位置开始读 byteBuffer.limit(1); //设置limit为1,表示当前bytebuffer的有效数据长度是1 byte bs = byteBuffer.get(); System.out.println(byteBuffer); } }
转载于:https://www.cnblogs.com/barrywxx/p/8546601.html
AIO系列文档(1)----图解ByteBuffer相关推荐
- AIO系列文档(2)----TIO使用
AIO系列文档(1)----图解ByteBuffer中介绍了ByteBuffer用法,下面通过介绍t-io介绍如何使用: hello world例子简介 本例子演示的是一个典型的TCP长连接应用,代码 ...
- java openoffice 打印_java调用openoffice将office系列文档转换为PDF的示例方法
前导: 发过程中经常会使用java将office系列文档转换为PDF, 一般都使用微软提供的openoffice+jodconverter 实现转换文档. openoffice既有windows版本也 ...
- 老猿学5G扫盲贴:3GPP规范文档命名规则及同系列文档阅读指南
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在学习5G规范过程中,有些内容把握不定的时候,有时 ...
- 知识图谱问答系列文档(一)——思知机器人简介
(一)思知项目介绍 思知机器人项目简介 知识图谱 对话机器人 思知机器人项目简介 思知项目开放了对话机器人.知识图谱.语义理解.自然语言处理工具.知识图谱融合了两千五百多万的实体,拥有亿级别的实体属性 ...
- Sharepoint学习笔记—ECM系列--文档集(Document Set)的实现
文档集是 SharePoint Server 2010 中的一项新功能,它使组织能够管理单个可交付文档或工作产品(可包含多个文档或文件).文档集是特殊类型的文件夹,它合并了唯一的文档集属性以及文件夹和 ...
- 微软官网html官方文档,微软官方的.net系列文档
获取Windows操作系统的CPU使用率以及内存使用率 此功能参考了ProcessHacker项目的代码. 声明定义 typedef struct _UINT64_DELTA { ULONG64 Va ...
- 微软官方的.net系列文档
闲下来的时候给自己补充补充基础,微软官方的相关技术文档地址,最新最全最官方:https://docs.microsoft.com/zh-cn/ 其中.NET专区:https://docs.micros ...
- 学VC 编游戏 重点算法解疑系列文档 - 走四方
对manmove()和bianfw()的理解 manmove()实际上实现的作用是计算man[i](i的值由manmove()的入口参数i的当前值取得)的man[i].xix,man[i],yiy当前 ...
- JEECMS8——系列文档
jeecms8 系列文章地址 https://blog.csdn.net/weixin_37490221/article/details/78652035 转载于:https://www.cnblog ...
最新文章
- mysql分组和where条件查询_【MySQL】:分组查询where和having
- ks检验正态分布结果_统计学里的数据正态性检验
- String与List类型互转
- JavaWeb第四讲 会话跟踪技术HttpSession、Cookie、url、隐藏表单域
- could not insert into NHibernate数据库问题解决
- c/c++比较灵活的方法:回调函数和函数指针
- SAP Spartacus的persist focus
- 身体对腐朽灵魂的一次震撼:向京的雕塑与观众的行为
- ios程序 调试log宏的添加
- 关于Android的应用程序的发布的学习(一)
- 如何在视图中启用thymeleaf
- POJ 3621 Sightseeing Cows [最优比率环]
- 索尼android 8,索尼宣布Android 8.0升级名单 Z系列被抛弃
- [渝粤教育] 西南科技大学 数据库应用 在线考试复习资料(5)
- 【元胞自动机】基于matlab元胞自动机模拟交通流【含Matlab源码 355期】
- Python常用模块8-Python的email模块简介
- 01 MQTT小例子-连接
- 【Gamemaker】YYC1.4编译的程序研究
- 重建oracle inventory
- 【通通免费】分享3个超级实用的电脑小工具,一个都不能少哦!
热门文章
- Netbeans、Eclipse中查看JDK源码
- 实验三 编程、编译、连接、跟踪
- windows下cmd中命令操作
- HTML 中CSS 图像详解
- Shank的大步小步算法(Shank‘s Baby-Step-Giant-Step Algorithm)
- WinForm中WebBrowser的使用
- 不一样的结果,不一样的人生
- Visual Studio 2008 无法切换到设计视图
- Computed property “value1“ was assigned to but it has no setter.
- 作为前端,你需要懂得javascript实现继承的方法