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中的缓冲区相关推荐

  1. 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. ...

  2. netty入门前置知识-NIO

    netty入门前置知识-NIO Netty简介 Netty 的介绍 Netty 的应用场景 互联网行业 游戏行业 大数据领域 其它开源项目使用到 Netty Netty 的学习资料参考 Java BI ...

  3. Netty入门之BIO,NIO和AIO编程

    Netty简介 Netty 的介绍 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目. Netty 是一个异步的.基于事件驱动的网络应用框架,用以快速开发 ...

  4. Netty学习笔记一NIO基础

    Netty学习笔记一 一. NIO 基础 non-blocking io 非阻塞IO (也可称为new IO, 因为是JDK1.4加入的) 1. 三大组件 1.1 Channel 通道:数据的传输通道 ...

  5. NIO入门系列之第3章:从理论到实践:NIO 中的读和写

    3.1  概述 读和写是 I/O 的基本过程.从一个通道中读取很简单:只需创建一个缓冲区,然后让通道将数据读到这个缓冲区中.写入也相当简单:创建一个缓冲区,用数据填充它,然后让通道用这些数据来执行写入 ...

  6. epoll 浅析以及 nio 中的 Selector

    转载自 epoll 浅析以及 nio 中的 Selector 首先介绍下epoll的基本原理,网上有很多版本,这里选择一个个人觉得相对清晰的讲解(详情见reference): 首先我们来定义流的概念, ...

  7. Java NIO_I/O基本概念_Java中的缓冲区(Buffer)_通道(Channel)_网络I/O

    I/O基本概念 缓冲区基础 缓冲区是I/O的基础, 进程使用read(), write()将数据读出/写入从缓冲区中; 当缓冲区写满, 内核向磁盘发出指令, 将缓冲区中数据写入磁盘中(这一步不需要CP ...

  8. Netty精粹之JAVA NIO开发需要知道的

    学习Netty框架以及相关源码也有一小段时间了,恰逢今天除夕,写篇文章总结一下.Netty是个高效的JAVA NIO框架,总体框架基于异步非阻塞的设计,基于网络IO事件驱动,主要贡献在于可以让用户基于 ...

  9. NIO的空轮询bug是什么?netty是如何解决NIO空轮询bug的?

    文章目录 1. NIO的空轮询bug 2. netty如何解决NIO空轮询bug的? 1. NIO的空轮询bug JDK1.5开始引入了epoll基于事件响应机制来优化NIO.相较于select和po ...

  10. NIO中的几个基础概念

    一.NIO中的几个基础概念  在NIO中有几个比较关键的概念:Channel(通道),Buffer(缓冲区),Selector(选择器). 首先从Channel说起吧,通道,顾名思义,就是通向什么的道 ...

最新文章

  1. C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例
  2. c++程序员会用到的函数积累
  3. java连接mongodb_第78天: Python 操作 MongoDB 数据库介绍
  4. lnmp环境搭建完全手册(四)——lnmp搭建(源码安装)
  5. mysql数据库导出时报错mysqldump: Got error: 145的解决方法
  6. 解决克隆centos虚拟机后ip配置失败的问题
  7. WordPress目录解析
  8. 用阿里服务器搭建彩虹网代刷平台
  9. [简历模板] 英文简历要用到的各种词汇-奖学金/担任职务(很全)
  10. 华为HCIE云计算认证备考通过心得
  11. ai人工智能_AI如何影响可访问性
  12. android开发工具Eclipse Locat如何过滤log
  13. arcgis拼接影像
  14. 光辉岁月-Beyond
  15. BMC Discovery增强开放性 与CyberArk在安全上达成互补
  16. 获取行政边界经纬度数据
  17. DevOps落地实践:BAT系列:ALI:企业研发效能解决方案
  18. 叫春、主旋律、本山大叔的硬伤和春晚苍蝇
  19. 电脑版android版iphone版ipad版,[下载]微软发布iPad版Office iPhone版Android版彻底免费...
  20. 今天收留了一条流浪的小狗

热门文章

  1. 遗传算法解决TSP问题MATLAB实现(详细)
  2. 从零基础入门Tensorflow2.0 ----七、33 数据padding,模型构建,训练
  3. python 绘制多个子图
  4. ArcGIS操作小技巧(五)之色带-----横向(水平)图例
  5. mysql php 空格函数_MySQL_mysql 强大的trim() 函数,mysql中的去除左空格函数: LTRI - phpStudy...
  6. SSH项目搭建-01-使用idea创建Maven工程
  7. Android PopupWindow的简单说明
  8. 图片版坦克大战源代码之坦克类(二)
  9. Flink on K8s 在京东的持续优化实践
  10. 寒冬之下,被cai的那些人到底去哪了?