Netty的前期准备:初探NIO中的缓冲区
2019独角兽企业重金招聘Python工程师标准>>>
NIO的参考文档
1 http://blog.sina.com.cn/s/blog_81c2545a01011afh.html
只要是网络操作,就涉及到IO读写,那自然离不开数据缓存。
NIO作为Netty的异步IO提供商,内部的缓冲区是各种各样的Buffer子类。
所以掌握Buffer是非常有必要的。
正所谓“工欲善其事,必先利其器”嘛。
---------------------------------------------------------------------------
常用的就是ByteBuffer,所以下面以此为例子,(喜欢字节,封装神马的最让人痛恨!!!)
分配
ByteBuffer buffer = ByteBuffer.allocate(100); 分配一个100字节容量的缓冲区
byte[] data=buffer.array(); 直接获取其内部存储对象,可直接修改,
请注意这里的修改是真实的修改缓冲区对应的存储对象。
所以不需要再次对缓冲区buffer进行操作就可以保留修改。
直接分配
《JAVA网络编程》P353 ---除非性能是个问题,否则不应考虑使用此类型的直接缓冲区
包装
实际上就是构造时初始化一些内容。有点类似于malloc和calloc的区别。
包装与分配的区别在于:
分配是重新构造一个新的数组,然后传给某个构造函数。
包装是直接引用之前内容所在的数组,然后传给某个构造函数。
本质都是一样的。
---
填充的例子:
可见pos慢慢增加,pos其实就是下一个可写入的位置,当没有填入任何东西时,pos自然是0.
----------------------------------------------------------------------------------------------------
缓冲区最多只能填充到最大容量,否则会报错,比如:
其实报错的逻辑是这样的:
public ByteBuffer put(byte x) {
hb[ix(nextPutIndex())] = x;
return this;
}
但是在计算nextPutIndex会做校验,校验的代码是这样的:
final int nextPutIndex() { // package-private
if (position >= limit)
throw new BufferOverflowException();
return position++;
}
不难理解了吧。
------------------------------------------------------------------------------------
其实根据打印的信息,此时的那些position limit capacity,
基本表示的意思就是:下一个可写入的字符位置 ,最大可写入字符位置(哨兵角色),总容量个数。
这个从上面的nextPutIndex通过position和limit比较也验证了这一点。
------------------------------------------------------------------------------------
此时,如果写入结束的话,想读取,就必须执行一个flip函数。
为啥变成了pos=0,lim=5,cap=12呢。
其实也就是说:你不是想读取么,好啊,下一个可读取的位置是0,最多可以读到5,总的缓存区容量还是12个。
这个是为读做了一个准备!下面就真的可以开始读取了!
我们看看hasRemaining()的代码,我猜是把pos跟lim比较,
public final boolean hasRemaining() {
return position < limit;
}
代码果然如此。
再看看get,是把position当前位置的内容返回,然后把position自增一个。
毫无秘密可言,真是蛋疼,我还是喜欢C的简单直白。
简单粗暴,不那么多废话。
===========================================
除了利用ByteBuffer提供的各种啰嗦API之外,如果你喜欢简单粗暴的方法的话。
ByteBuffer也满足你。(控制狂专用API)
buffer.put(index,'H');
buffer.get(index);
因为你直接指定了index.
看一看代码实现:
public byte get() {
return hb[ix(nextGetIndex())];
}
public byte get(int i) {
return hb[ix(checkIndex(i))];
}
就不用我多说啥了。
究极控制狂的方法:
byte[] data = buffer.array();
好吧,你厉害,你拿到了缓冲区的数组,连指示器都不要了,
你就把它当做一个数组来用吧。
话说,如果这样做的话,还要ByteBuffer干嘛。:)
因为如果你直接操作一个数组的话,你还是需要若干指示器。
--------------------------------------------
ByteBuffer同样提供了批量操作方法,原理都是一样,
这里我就不给API了,自己去看代码吧。
--------------------------------------------
视图缓冲区
哎,还能不能给人自我控制的感觉了,封装这么多干嘛。。。
压缩缓冲区
也就是说,你之前正在写,写了一半,然后还剩下若干字节
这若干字节左边是空的,右边是空的。
这不是很尴尬嘛,要是把中间这几个字节挪到最左边从0开始就好了。
compact就是干这个的,汗。
很简单,没啥好说的了。
JAVA就是折腾。。。
转载于:https://my.oschina.net/qiangzigege/blog/389809
Netty的前期准备:初探NIO中的缓冲区相关推荐
- Netty原理详解系列(一)---NIO中的BufferChanel
文章目录 1.概述 2.缓冲区Buffer定义 3.Buffer内部结构 4.Buffer常用的操作 4.1 allocate 4.2 wrap 4.3 put 4.4 flip 4.5 get 4. ...
- netty入门前置知识-NIO
netty入门前置知识-NIO Netty简介 Netty 的介绍 Netty 的应用场景 互联网行业 游戏行业 大数据领域 其它开源项目使用到 Netty Netty 的学习资料参考 Java BI ...
- Netty入门之BIO,NIO和AIO编程
Netty简介 Netty 的介绍 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目. Netty 是一个异步的.基于事件驱动的网络应用框架,用以快速开发 ...
- Netty学习笔记一NIO基础
Netty学习笔记一 一. NIO 基础 non-blocking io 非阻塞IO (也可称为new IO, 因为是JDK1.4加入的) 1. 三大组件 1.1 Channel 通道:数据的传输通道 ...
- NIO入门系列之第3章:从理论到实践:NIO 中的读和写
3.1 概述 读和写是 I/O 的基本过程.从一个通道中读取很简单:只需创建一个缓冲区,然后让通道将数据读到这个缓冲区中.写入也相当简单:创建一个缓冲区,用数据填充它,然后让通道用这些数据来执行写入 ...
- epoll 浅析以及 nio 中的 Selector
转载自 epoll 浅析以及 nio 中的 Selector 首先介绍下epoll的基本原理,网上有很多版本,这里选择一个个人觉得相对清晰的讲解(详情见reference): 首先我们来定义流的概念, ...
- Java NIO_I/O基本概念_Java中的缓冲区(Buffer)_通道(Channel)_网络I/O
I/O基本概念 缓冲区基础 缓冲区是I/O的基础, 进程使用read(), write()将数据读出/写入从缓冲区中; 当缓冲区写满, 内核向磁盘发出指令, 将缓冲区中数据写入磁盘中(这一步不需要CP ...
- Netty精粹之JAVA NIO开发需要知道的
学习Netty框架以及相关源码也有一小段时间了,恰逢今天除夕,写篇文章总结一下.Netty是个高效的JAVA NIO框架,总体框架基于异步非阻塞的设计,基于网络IO事件驱动,主要贡献在于可以让用户基于 ...
- NIO的空轮询bug是什么?netty是如何解决NIO空轮询bug的?
文章目录 1. NIO的空轮询bug 2. netty如何解决NIO空轮询bug的? 1. NIO的空轮询bug JDK1.5开始引入了epoll基于事件响应机制来优化NIO.相较于select和po ...
- NIO中的几个基础概念
一.NIO中的几个基础概念 在NIO中有几个比较关键的概念:Channel(通道),Buffer(缓冲区),Selector(选择器). 首先从Channel说起吧,通道,顾名思义,就是通向什么的道 ...
最新文章
- C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例
- c++程序员会用到的函数积累
- java连接mongodb_第78天: Python 操作 MongoDB 数据库介绍
- lnmp环境搭建完全手册(四)——lnmp搭建(源码安装)
- mysql数据库导出时报错mysqldump: Got error: 145的解决方法
- 解决克隆centos虚拟机后ip配置失败的问题
- WordPress目录解析
- 用阿里服务器搭建彩虹网代刷平台
- [简历模板] 英文简历要用到的各种词汇-奖学金/担任职务(很全)
- 华为HCIE云计算认证备考通过心得
- ai人工智能_AI如何影响可访问性
- android开发工具Eclipse Locat如何过滤log
- arcgis拼接影像
- 光辉岁月-Beyond
- BMC Discovery增强开放性 与CyberArk在安全上达成互补
- 获取行政边界经纬度数据
- DevOps落地实践:BAT系列:ALI:企业研发效能解决方案
- 叫春、主旋律、本山大叔的硬伤和春晚苍蝇
- 电脑版android版iphone版ipad版,[下载]微软发布iPad版Office iPhone版Android版彻底免费...
- 今天收留了一条流浪的小狗
热门文章
- 遗传算法解决TSP问题MATLAB实现(详细)
- 从零基础入门Tensorflow2.0 ----七、33 数据padding,模型构建,训练
- python 绘制多个子图
- ArcGIS操作小技巧(五)之色带-----横向(水平)图例
- mysql php 空格函数_MySQL_mysql 强大的trim() 函数,mysql中的去除左空格函数: LTRI - phpStudy...
- SSH项目搭建-01-使用idea创建Maven工程
- Android PopupWindow的简单说明
- 图片版坦克大战源代码之坦克类(二)
- Flink on K8s 在京东的持续优化实践
- 寒冬之下,被cai的那些人到底去哪了?