缓存区 Buffer 是数据容器

  • ByteBuffer 可以存储除了 boolean 以外的其他 7 种Java基本数据类型,如 getInt、putInt
  • Buffer 是抽象类,它有除了 Boolean 以外的其他 7 种Java基本数据类型子类,如IntBuffer

缓存区的初始化

⑴ 静态方法 allocate:初始化一个指定容量的缓存区

解释一下图例:

1.数组下标:数字(1,2,3,4,5)表示数组下标

1.数组:灰色长方形内表示真实有效的数组。

2.数组元素:数字所在的白色黑边正方形表示数组元素,可以通过例如 array[0] 来获取数组元素。但是注意,图中没有明确指定数组元素的值是什么。

3.虚拟下标:其中 -16 是虚拟的下标位置,如果使用这2个下标取值( array[-1] 或者 array[6] )会抛出 IndexOutOfBoundsException

⑵ 静态方法 wrap:把一个数组初始化成一个缓存区

  • 如果是只把数组 array 作为 wrap 的参数,那么效果和 allocate 类似。但是,修改数组中的值,等同于修改缓存区的值。
  • 如果除了数组引用 array 外,还有 offsetlength 来指定子数组的开始位置和子数组的大小。效果如下图:

  • 灰色的部分就是数组参数 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,清除标记位置

剩余空间与超限异常

剩余空间

\[0 <= 标记 <= 位置 <= 限制 <= 容量
\]

其中,

\[remaining = limit - position
\]

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的更多相关文章

  1. Java NIO中的缓冲区Buffer(一)缓冲区基础

    什么是缓冲区(Buffer) 定义 简单地说就是一块存储区域,哈哈哈,可能太简单了,或者可以换种说法,从代码的角度来讲(可以查看JDK中Buffer.ByteBuffer.DoubleBuffer等的 ...

  2. Java NIO中的缓冲区Buffer(二)创建/复制缓冲区

    创建缓冲区的方式 主要有以下两种方式创建缓冲区: 1.调用allocate方法 2.调用wrap方法 我们将以charBuffer为例,阐述各个方法的含义: allocate方法创建缓冲区 调用all ...

  3. 详解 缓冲区(Buffer 抽象类)

    在本篇博文中,本人主要讲解NIO 的两个核心点 -- 缓冲区(Buffer) 和 通道 (Channel)之一的 缓冲区(Buffer), 有关NIO流的其他知识点请观看本人博文<详解 NIO流 ...

  4. Java NIO入门(二):缓冲区内部细节

    Java NIO 入门(二)缓冲区内部细节 概述 本文将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor). 状态变量是前一文中提到的"内部统计机制"的 ...

  5. NIO(一)——缓冲区Buffer

                                        NIO(一)--Buffer NIO简介 NIO即New IO,是用来代替标准IO的,提供了与标准IO完全不同传输方式. 核心: ...

  6. Java NIO -- 缓冲区(Buffer)的数据存取

    缓冲区(Buffer): 一个用于特定基本数据类型的容器.由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类.Java NIO 中的 Buffer 主要用于与 NIO 通道进行 ...

  7. NIO之缓冲区(Buffer)的数据存取

    缓冲区(Buffer) 一个用于特定基本数据类行的容器.有java.nio包定义的,所有缓冲区都是抽象类Buffer的子类. Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通道 ...

  8. JAVA NIO缓冲区(Buffer)------ByteBuffer常用方法

    参考:https://blog.csdn.net/xialong_927/article/details/81044759 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I ...

  9. Java NIO 缓冲区 Buffer

    缓冲区 Buffer 是 Java NIO 中一个核心概念,它是一个线性结构,容量有限,存放原始类型数据(boolean 除外)的容器. 1. Buffer 中可以存放的数据类型 java.nio.B ...

随机推荐

  1. 黎活明8天快速掌握android视频教程--23_网络通信之网络图片查看器

    1.首先新建立一个java web项目的工程.使用的是myeclipe开发软件 图片的下载路径是http://192.168.1.103:8080/lihuoming_23/3.png 当前手机和电脑 ...

  2. springmvc-实现增删改查

    30. 尚硅谷_佟刚_SpringMVC_RESTRUL_CRUD_显示所有员工信息.avi现在需要使用restful风格实现增删改查,需要将post风格的请求转换成PUT 请求和DELETE 请求 ...

  3. Python实用笔记 (17)模块

    一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块. 现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲 ...

  4. web开发相关概念

    什么是web通信? WEB采用B/S通信模式,通过超文本传送协议(HTTP, Hypertext transport protocol)进行通信.通过浏览器地址栏编写URL,向服务器发送一个请求,服务 ...

  5. 一起来看 HTML 5.2 中新的原生元素 <dialog>

    不到一个月前,HTML 5.2 正式成为 W3C 的推荐标准(REC),其中,推出了一个新的原生模态对话框元素 <dialog>,乍一看,可能感觉它就是一个新增的元素,然而,作者最近在玩的 ...

  6. 洛谷 P3694 邦邦的大合唱站队 状压DP

    题目描述 输入输出样例 输入 #1 复制 12 4 1 3 2 4 2 1 2 3 1 1 3 4 输出 #1 复制 7 说明/提示 分析 首先要注意合唱队排好队之后不一定是按\(1.2.3..... ...

  7. Java数组的定义与使用

    一.数组概念 可以将多个同一数据类型的数据,存储到同一个容器中 1. 格式 数据类型[] 数组名=new 数据类型[元素个数] "数据类型"表示该数组中可以存放哪一类型的数据 &q ...

  8. python爬京东(带GUI)

    最近写了个专门爬百度的,后来又想爬京东的,还是采用上次的BeautifulSoup+requests模块 下面直接上代码,看不懂的可以看这篇文章或者注释来学习 #!/usr/bin/env pytho ...

  9. 合并两个有序链表(剑指offer-16)

    题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解答方法1:递归 /* public class ListNode { int val; List ...

  10. Talk About AWS Aurora for MySQL max_connections parameter Calculation | 浅谈AWS Aurora for MySQL数据库中 max_connections参数的计算

    1. The Problem | 现象 When connect to the product environment database of my company, the Navicat show ...