NIO入门之缓冲区Buffer
缓存区 Buffer 是数据容器

- ByteBuffer 可以存储除了 boolean 以外的其他 7 种Java基本数据类型,如 getInt、putInt
- Buffer 是抽象类,它有除了 Boolean 以外的其他 7 种Java基本数据类型子类,如
IntBuffer
缓存区的初始化
⑴ 静态方法 allocate:初始化一个指定容量的缓存区

解释一下图例:
1.数组下标:数字(1,2,3,4,5)表示数组下标
1.数组:灰色长方形内表示真实有效的数组。
2.数组元素:数字所在的白色黑边正方形表示数组元素,可以通过例如 array[0] 来获取数组元素。但是注意,图中没有明确指定数组元素的值是什么。
3.虚拟下标:其中-1和6是虚拟的下标位置,如果使用这2个下标取值( array[-1] 或者 array[6] )会抛出 IndexOutOfBoundsException
⑵ 静态方法 wrap:把一个数组初始化成一个缓存区
- 如果是只把数组
array作为 wrap 的参数,那么效果和 allocate 类似。但是,修改数组中的值,等同于修改缓存区的值。 - 如果除了数组引用
array外,还有offset和length来指定子数组的开始位置和子数组的大小。效果如下图:

- 灰色的部分就是数组参数
array - 虚线框的部分表示从数组中划出的 子数组
缓存区存储数据

put()填充一个新的元素到数组中- 当前位置右移(position++)
缓冲区获取数据

get()获取当前位置的元素- 当前位置右移(position++)
核心操作
flip 操作
由写模式 转换为> 读模式

- limit = position,限制转到原先的 position 位置
- position = 0,游标归零
- mark = -1,标记清空
注意:
虽然,flip 的中文含义是 “翻动”,但是连续调用 flip 不能实现 写模式 -> 读模式 -> 写模式!
连续调用 flip 之后,postion == limit == 0。
因此,继续调用 get() 会抛出 读取超限 BufferUnderflowException ,调用 put() 会抛出 写入超限 BufferOverflowException
clear 操作
重新回到初始化状态,重新进入写模式

- limit = capacity,限制回归到容器容量
- position = 0,游标归零
- mark = -1,标记清空
注意
clear 实际并不会清理数据,而是调整 limit、position、mark 指向的位置
mark 操作

- mark = position,记录下当前位置
使用场景
替换一段内容:添加标记,以便后续调用 reset() 将 position 回到标记。
reset 操作

- position = mark,当前位置回到标记位置
注意

mark < 0抛出无效标记异常。说明必须要先 mark() 才能调用 reset()
rewind 操作

- position = 0,当前位置归零
- mark = -1,清除标记位置
剩余空间与超限异常
剩余空间
\]
其中,
\]
remaining 表示剩余空间大小。hasRemaining() 用来查询是否还有剩余空间。
读取超限

- 在
get读取数据时,如果position >= limit,抛出 BufferUnderflowException 异常
写入超限

- 在
put写入数据时,如果position >= limit,抛出 BufferOverflowException 异常
注意
如果是使用 wrap 初始化的缓冲区,即使没有到达容器容量 capacity,也会报错,因为此时 limit < capacity

总结:
- Buffer缓冲区是数据容器,可以用于读 get() 也可以用于写 put()。
- flip() 可以从写模式切换到读模式
- clear() 可以回到初始化状态
- mark() 和 reset() 需要配合使用,主要用于 替换某段内容
- 无论是读取超限还是写入超限,条件都是
position >= limit。即 如果进行接下来的读或者写操作,当前位置都将超过限制。
NIO入门之缓冲区Buffer的更多相关文章
- Java NIO中的缓冲区Buffer(一)缓冲区基础
什么是缓冲区(Buffer) 定义 简单地说就是一块存储区域,哈哈哈,可能太简单了,或者可以换种说法,从代码的角度来讲(可以查看JDK中Buffer.ByteBuffer.DoubleBuffer等的 ...
- Java NIO中的缓冲区Buffer(二)创建/复制缓冲区
创建缓冲区的方式 主要有以下两种方式创建缓冲区: 1.调用allocate方法 2.调用wrap方法 我们将以charBuffer为例,阐述各个方法的含义: allocate方法创建缓冲区 调用all ...
- 详解 缓冲区(Buffer 抽象类)
在本篇博文中,本人主要讲解NIO 的两个核心点 -- 缓冲区(Buffer) 和 通道 (Channel)之一的 缓冲区(Buffer), 有关NIO流的其他知识点请观看本人博文<详解 NIO流 ...
- Java NIO入门(二):缓冲区内部细节
Java NIO 入门(二)缓冲区内部细节 概述 本文将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor). 状态变量是前一文中提到的"内部统计机制"的 ...
- NIO(一)——缓冲区Buffer
NIO(一)--Buffer NIO简介 NIO即New IO,是用来代替标准IO的,提供了与标准IO完全不同传输方式. 核心: ...
- Java NIO -- 缓冲区(Buffer)的数据存取
缓冲区(Buffer): 一个用于特定基本数据类型的容器.由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类.Java NIO 中的 Buffer 主要用于与 NIO 通道进行 ...
- NIO之缓冲区(Buffer)的数据存取
缓冲区(Buffer) 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通道 ...
- JAVA NIO缓冲区(Buffer)------ByteBuffer常用方法
参考:https://blog.csdn.net/xialong_927/article/details/81044759 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I ...
- Java NIO 缓冲区 Buffer
缓冲区 Buffer 是 Java NIO 中一个核心概念,它是一个线性结构,容量有限,存放原始类型数据(boolean 除外)的容器. 1. Buffer 中可以存放的数据类型 java.nio.B ...
随机推荐
- JavaWeb网上图书商城完整项目--day02-8.提交注册表单功能之dao、service实现
1.发送邮件 发送邮件的时候的参数我们都写在了配置文件中,配置文件放在src目录下,可以使用类加载器进行加载该数据 //向注册的用户发送邮件 //1读取配置文件 Properties properti ...
- swagger ui demo
前言 前几天一个朋友公司在用Springboot集合swagger时候总是从浏览器看不了接口,我两找了问题,但是他还是没有找到,于是我就自己从http://start.spring.io/上下载了一个 ...
- 4. union-find算法
算法的主题思想: 1.优秀的算法因为能够解决实际问题而变得更为重要: 2.高效算法的代码也可以很简单: 3.理解某个实现的性能特点是一个挑战: 4.在解决同一个问题的多种算法之间进行选择时,科学方法是 ...
- Spring Bean各阶段生命周期的介绍
一.xml方式配置bean 二.Aware接口 2.1 BeanNameAware 2.2 BeanFactoryAware 2.3 ApplicationContextAware 2.4 Aware ...
- Spring IoC 循环依赖的处理
前言 本系列全部基于 Spring 5.2.2.BUILD-SNAPSHOT 版本.因为 Spring 整个体系太过于庞大,所以只会进行关键部分的源码解析. 本篇文章主要介绍 Spring IoC 是 ...
- JavaWeb项目在浏览器点击几次就阻塞了
问题描述 在学习JavaWeb项目时,通过IDE启动项目后,在浏览器点击几次页面中的链接就阻塞了,浏览器一直转圈圈无法加载,后台日志也没有输出. 第一次遇见这种情况,没有日志完全无法分析到底是什么问题 ...
- 这样基于Netty重构RPC框架你不可能知道
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365天原创计划”第5天. 今天呢!灯塔君跟大家讲: 基于Netty重构RPC框架 一.CyclicBarrier方法说明 1. ...
- CSS3 clip-path 用法介绍
一.基本概念 刷新 QQ 空间动态时,发现一则广告,随着用户上下滑动动态列表,就会自动切换广告图片,这样的效果对移动端本就不大的屏幕来说,无疑是很精妙的考虑,这样的效果是怎么实现的呢? 你可以点击这里 ...
- python 如何判断一组数据是否符合正态分布
正态分布: 若随机变量x服从有个数学期望为μ,方差为σ2 的正态分布,记为N(μ,σ) 其中期望值决定密度函数的位置,标准差决定分布的幅度,当υ=0,σ=0 时的正态分布是标准正态分布 判断方法有画图 ...
- CountDownLatch 线程工具类
CountDownLatch:概念是,允许一个或多个线程等待其他线程完成操作: 在线程基础知识中,学习过线程的join方法,当前线程阻塞等待join线程执行完毕才能执行: 测试代码如下: public ...