NIO(一)——Buffer

  • NIO简介
  • NIO即New IO,是用来代替标准IO的,提供了与标准IO完全不同传输方式。
  • 核心:通道(Channel)和缓冲区(Buffer)和选择器(Selectors),Channel负责传输,Buffer负责存储
  • 与标准IO的区别

    • 标准IO是面向字节流的,NIO是面向缓冲区的
    • 标准IO是阻塞IO,NIO是非阻塞IO
  1. 当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。

NIO具有选择器Selectors

  1. 选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道
  • 缓冲区Buffer
    • 在Java NIO中负责数据的存取。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。
    • 根据数据类型的不同,提供了不同类型的缓冲区(boolean除外):
    1. ByteBuffer
    2. ShortBuffer
    3. IntBuffer
    4. LongBuffer
    5. FloatBuffer
    6. DoubleBuffer
    7. CharBuffer
  • 上述缓冲区的管理方式几乎一致,通过allocate()获取缓冲区:
  1. ByteBuffer buf = ByteBuffer.allocate(1024);

缓冲区存储数据的两个核心方法:

  1. put():存数据到缓冲区
  2. get():从缓冲区取数据

缓冲区中的核心属性:

  1. capacity:容量,表示缓冲区中最大存储数据的容量,一旦声明不可改变
  2. limit:界限,表示缓存区冲可以操作数据的大小。limit后的数据不能进行读写(读和写操作含义不同)
  3. position:位置,表示缓冲区中正在操作的数据的位置
  4. mark:标记,表示记录当前position的位置,可以通过reset()恢复到mark的位置
  5. 0<=mark<=position<=limit<=capacity
  • 方法:
    • flid()方法:在切换读写模式的时候必须调用flid()方法
    1. buf.flip();
    2. flip()方法:
                  public final Buffer flip() {limit = position;position = 0;mark = -1;return this;}
  • rewind()方法:
  1. 可重复读数据,将position置0,limit不变
  2.   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();
    • 直接缓冲区与非直接缓冲区:
    1. 非直接缓冲区:通过allocate()方法分配缓冲区,将缓冲区建立在JVM内存中
    2.  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相关推荐

  1. 【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )

    文章目录 I . NIO 模型 II . NIO 三大组件交互流程 III . NIO 缓冲区 IV . NIO 与 BIO 对比 V . NIO 线程分配 VI . 缓冲区 ( Buffer ) 示 ...

  2. 【Netty】NIO 选择器 ( Selector ) 通道 ( Channel ) 缓冲区 ( Buffer ) 网络通信案例

    文章目录 I . NIO 通信 服务器端 流程说明 II . NIO 通信 服务器端代码 III . NIO 通信 客户端 流程说明 IV . NIO 通信 客户端代码 V . NIO 通信 示例运行 ...

  3. 【Netty】NIO 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 操作

    文章目录 I . 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 概念 II . 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathe ...

  4. 【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )

    文章目录 I . 缓冲区 ( Buffer ) 存取类型 II . 只读缓冲区 ( ReadOnlyBuffer ) III . 映射字节缓冲区 ( MappedByteBuffer ) I . 缓冲 ...

  5. 【Netty】NIO 缓冲区 ( Buffer ) 组件

    文章目录 I . NIO 三大核心组件 对应关系 II . 缓冲区 ( Buffer ) 类 III . 缓冲区 ( Buffer ) 机制 IV . 缓冲区 ( Buffer ) 机制 示例解析 V ...

  6. buffer java nio_Java NIO深入理解Buffer(缓冲区)

    前言 Github:https://github.com/yihonglei/java-all Project:java-nio 一 Buffer概述 Java NIO中的Buffer用于和NIO通道 ...

  7. Java NIO学习篇之缓冲区Buffer详解

    定义 缓冲区Buffer在java nio中负责数据的存储,缓冲区就是数组,用于存储不同类型数据的数组. jdk为java七大基本类型数据都准备了响应的缓冲区(boolean值除外): ByteBuf ...

  8. 95-50-040-java.nio.channels-NIO-NIO之Buffer(缓冲区)

    1.世界 Java NIO之Buffer(缓冲区) Buffer(缓冲区)介绍 Java NIO Buffers用于和NIO Channel交互. 我们从Channel中读取数据到buffers里,从 ...

  9. Java NIO三大核心之缓冲区Buffer概述

    三大核心原理示意图  说明: 每个 Channel 都会对应一个 Buffer: Selector 对应一个线程,一个线程对应多个 Channel(连接): 该图反应了有三个 Channel 注册到该 ...

最新文章

  1. mysql库可以无限创建吗_mysql 创建库
  2. 视频监控系统供电方式及选择方法
  3. 你的 mixin 兼容 ECMAScript 5 吗?
  4. 快递打印云服务器_企业微信支持寄快递查快递,实现员工寄件自由
  5. zipoutputstream压缩文件响应到浏览器_现代浏览器内部机制之导航这件小事
  6. 排序算法 —— 选择排序
  7. gridview 动态数据操作
  8. EntityFramework Core表名原理解析,让我来,揭开你神秘的面纱
  9. 类与对象 格式小结 java 1202
  10. Visual Studio 2015 和 Apache Cordova 跨平台开发入门(一)
  11. 每天进步一点点《ML - DBSCAN》
  12. mysql入参映射_Mybatis中的Mapper映射Sql中传参类型(如Bean,基本类型,List...)与取值的方式 与foreach的几种用法!!...
  13. oracle将把varchar2字段(长度4000)改为clob类型
  14. Intel 芯片集被曝漏洞,可导致加密数据被盗
  15. 实现网页布局的自适应 利用@media screen
  16. 关于ASp.NEt方面的好书,不得不看啊!!!
  17. 数字化审图时代批量生成PDF或者DWF利器SmartBatchPlot
  18. 日文windows系统 oracle数据库乱码的处理
  19. 正版游戏怎么开服务器,方舟生存进化
  20. 修改数据 (通过页面修改数据库数据)

热门文章

  1. CodeForces round 753 problem B Odd Grasshopper(奇怪的蚱蜢)
  2. python os模块手册_Python OS模块常用函数说明
  3. git 代码提交过程
  4. 地理信息考c语言,南师地理信息系统专业01方向真题C语言
  5. 【CCCC】L3-013 非常弹的球 (30分)物理计算
  6. 计算机类专业工程认证,计算机类专业工程教育专业认证补充标准
  7. Oracle→数字函数、字符函数、时间函数、SYSDATE、TO_CHAR()、TO_DATE()、TO_NUMBER()、NVLNVL2NULLIF、ROW_NUMBER()
  8. JavaScript文件存储信息对象cookie编码生存期
  9. python print不换行输出_python中print如何不换行输出
  10. JavaScript用法(1)