NIO(一)——缓冲区Buffer
NIO(一)——Buffer
- NIO简介
- NIO即New IO,是用来代替标准IO的,提供了与标准IO完全不同传输方式。
- 核心:通道(Channel)和缓冲区(Buffer)和选择器(Selectors),Channel负责传输,Buffer负责存储
- 与标准IO的区别
- 标准IO是面向字节流的,NIO是面向缓冲区的
- 标准IO是阻塞IO,NIO是非阻塞IO
- 当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。
NIO具有选择器Selectors
- 选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道
- 缓冲区Buffer
- 在Java NIO中负责数据的存取。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。
- 根据数据类型的不同,提供了不同类型的缓冲区(boolean除外):
- ByteBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
- CharBuffer
- 上述缓冲区的管理方式几乎一致,通过allocate()获取缓冲区:
- ByteBuffer buf = ByteBuffer.allocate(1024);
缓冲区存储数据的两个核心方法:
- put():存数据到缓冲区
- get():从缓冲区取数据
缓冲区中的核心属性:
- capacity:容量,表示缓冲区中最大存储数据的容量,一旦声明不可改变
- limit:界限,表示缓存区冲可以操作数据的大小。limit后的数据不能进行读写(读和写操作含义不同)
- position:位置,表示缓冲区中正在操作的数据的位置
- mark:标记,表示记录当前position的位置,可以通过reset()恢复到mark的位置
- 0<=mark<=position<=limit<=capacity
- 方法:
- flid()方法:在切换读写模式的时候必须调用flid()方法
- buf.flip();
- flip()方法:
public final Buffer flip() {limit = position;position = 0;mark = -1;return this;}
- rewind()方法:
- 可重复读数据,将position置0,limit不变
public final Buffer rewind() {position = 0;mark = -1;return this;}
clear()与compact()方法:
- 一旦读完缓冲区中的数据,需要让缓冲区准备好再次被写入。可以通过clear()或compact方法来完成。
- 如果调用的是clear()方法,position将被置0,limit被设置为capacity的值。即缓冲区被清空。但缓冲区中的数据并未被清除。
- 如果缓冲区中有一些未读的数据,调用clean()方法,数据将“被遗忘”。
- 如果缓冲区中有一些未读的数据,且后续还需要这些数据,但此时想先写些数据,就使用compact()方法。compact()方法将所有未读的数据拷贝到Buffer起始处,然后将position设到最后一个未读元素后面,limit=capacity。
public final Buffer clear() {position = 0;limit = capacity;mark = -1;return this;}
public abstract ByteBuffer compact();
- 直接缓冲区与非直接缓冲区:
- 非直接缓冲区:通过allocate()方法分配缓冲区,将缓冲区建立在JVM内存中
public static ByteBuffer allocate(int capacity) {if (capacity < 0)throw new IllegalArgumentException();return new HeapByteBuffer(capacity, capacity);}
HeapByteBuffer(int cap, int lim) { super(-1, 0, lim, cap, new byte[cap], 0);}
ByteBuffer(int mark, int pos, int lim, int cap, byte[] hb, int offset){super(mark, pos, lim, cap);this.hb = hb;this.offset = offset;}
- 直接缓冲区:
- 通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率
public static ByteBuffer allocateDirect(int capacity) {return new DirectByteBuffer(capacity);}
DirectByteBuffer(int cap) { super(-1, 0, cap, cap); boolean pa = VM.isDirectMemoryPageAligned();//调用直接内存方法进行分配int ps = Bits.pageSize();long size = Math.max(1L, (long)cap + (pa ? ps : 0));Bits.reserveMemory(size, cap);long base = 0;try {base = unsafe.allocateMemory(size);} catch (OutOfMemoryError x) {Bits.unreserveMemory(size, cap);throw x;}unsafe.setMemory(base, size, (byte) 0);if (pa && (base % ps != 0)) {address = base + ps - (base & (ps - 1));} else {address = base;}cleaner = Cleaner.create(this, new Deallocator(base, size, cap));att = null;}
转载于:https://www.cnblogs.com/zhangnianxiang/p/9075425.html
NIO(一)——缓冲区Buffer相关推荐
- 【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )
文章目录 I . NIO 模型 II . NIO 三大组件交互流程 III . NIO 缓冲区 IV . NIO 与 BIO 对比 V . NIO 线程分配 VI . 缓冲区 ( Buffer ) 示 ...
- 【Netty】NIO 选择器 ( Selector ) 通道 ( Channel ) 缓冲区 ( Buffer ) 网络通信案例
文章目录 I . NIO 通信 服务器端 流程说明 II . NIO 通信 服务器端代码 III . NIO 通信 客户端 流程说明 IV . NIO 通信 客户端代码 V . NIO 通信 示例运行 ...
- 【Netty】NIO 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 操作
文章目录 I . 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 概念 II . 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathe ...
- 【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )
文章目录 I . 缓冲区 ( Buffer ) 存取类型 II . 只读缓冲区 ( ReadOnlyBuffer ) III . 映射字节缓冲区 ( MappedByteBuffer ) I . 缓冲 ...
- 【Netty】NIO 缓冲区 ( Buffer ) 组件
文章目录 I . NIO 三大核心组件 对应关系 II . 缓冲区 ( Buffer ) 类 III . 缓冲区 ( Buffer ) 机制 IV . 缓冲区 ( Buffer ) 机制 示例解析 V ...
- buffer java nio_Java NIO深入理解Buffer(缓冲区)
前言 Github:https://github.com/yihonglei/java-all Project:java-nio 一 Buffer概述 Java NIO中的Buffer用于和NIO通道 ...
- Java NIO学习篇之缓冲区Buffer详解
定义 缓冲区Buffer在java nio中负责数据的存储,缓冲区就是数组,用于存储不同类型数据的数组. jdk为java七大基本类型数据都准备了响应的缓冲区(boolean值除外): ByteBuf ...
- 95-50-040-java.nio.channels-NIO-NIO之Buffer(缓冲区)
1.世界 Java NIO之Buffer(缓冲区) Buffer(缓冲区)介绍 Java NIO Buffers用于和NIO Channel交互. 我们从Channel中读取数据到buffers里,从 ...
- Java NIO三大核心之缓冲区Buffer概述
三大核心原理示意图 说明: 每个 Channel 都会对应一个 Buffer: Selector 对应一个线程,一个线程对应多个 Channel(连接): 该图反应了有三个 Channel 注册到该 ...
最新文章
- mysql库可以无限创建吗_mysql 创建库
- 视频监控系统供电方式及选择方法
- 你的 mixin 兼容 ECMAScript 5 吗?
- 快递打印云服务器_企业微信支持寄快递查快递,实现员工寄件自由
- zipoutputstream压缩文件响应到浏览器_现代浏览器内部机制之导航这件小事
- 排序算法 —— 选择排序
- gridview 动态数据操作
- EntityFramework Core表名原理解析,让我来,揭开你神秘的面纱
- 类与对象 格式小结 java 1202
- Visual Studio 2015 和 Apache Cordova 跨平台开发入门(一)
- 每天进步一点点《ML - DBSCAN》
- mysql入参映射_Mybatis中的Mapper映射Sql中传参类型(如Bean,基本类型,List...)与取值的方式 与foreach的几种用法!!...
- oracle将把varchar2字段(长度4000)改为clob类型
- Intel 芯片集被曝漏洞,可导致加密数据被盗
- 实现网页布局的自适应 利用@media screen
- 关于ASp.NEt方面的好书,不得不看啊!!!
- 数字化审图时代批量生成PDF或者DWF利器SmartBatchPlot
- 日文windows系统 oracle数据库乱码的处理
- 正版游戏怎么开服务器,方舟生存进化
- 修改数据 (通过页面修改数据库数据)
热门文章
- CodeForces round 753 problem B Odd Grasshopper(奇怪的蚱蜢)
- python os模块手册_Python OS模块常用函数说明
- git 代码提交过程
- 地理信息考c语言,南师地理信息系统专业01方向真题C语言
- 【CCCC】L3-013 非常弹的球 (30分)物理计算
- 计算机类专业工程认证,计算机类专业工程教育专业认证补充标准
- Oracle→数字函数、字符函数、时间函数、SYSDATE、TO_CHAR()、TO_DATE()、TO_NUMBER()、NVLNVL2NULLIF、ROW_NUMBER()
- JavaScript文件存储信息对象cookie编码生存期
- python print不换行输出_python中print如何不换行输出
- JavaScript用法(1)