【Java 网络编程】NIO Buffer 简介 ( 概念 | 数据传输 | 标记 | 位置 | 限制 | 容量 | 标记 | 重置 | 清除 | 翻转 | 重绕 | 链式操作 )
文章目录
- I. Buffer 简介
- II. Buffer 属性
- III. Buffer 数据读写
- IV. Buffer 标记 mark() 和重置 reset()
- V. Buffer 清除 翻转 重绕
- VI. Buffer 缓冲区只读属性
- VII. Buffer 的链式调用
I. Buffer 简介
Buffer 是在 NIO 中定义的抽象类 , 其针对七种基本数据类型都有对应的实现类 , 如 ByteBuffer , CharBuffer , DoubleBuffer , FloatBuffer , IntBuffer , LongBuffer , ShortBuffer ; 其是用于缓存基本数据类型的容器 ;
Buffer 作用 : 在内存中创建指定大小的空间 , 对一些基本类型数据进行缓存 ; 使用缓存能减少读写磁盘的次数 , 这块缓存所占用的内存会一直使用 , 减少了动态内存分配的开销 ;
II. Buffer 属性
Buffer 缓冲区基本属性 :
- ① 容量 Capacity : 缓冲区元素个数 , 不可更改 ;
- ② 限制 Limit : 缓冲区的终点 , 从该索引开始 ( 包含该索引 ) , 不能对之后的元素进行读写操作 ; Limit 值可以修改 , 其值必须是自然数 ;
- ③ 位置 Position : 下一个要被读取或写入的元素索引 , 注意是下一个 , Position 初始值从 0 开始计数 , 如果没有读取就一直是 0 , 如果已经读取了 1 个元素 , 其 Position 值在读取完毕后变为 1 , 指向下一个将要读取的元素 ;
- ④ 标记 Mark : 调用 mark() 方法可以设置标记 Mark = Position , 之后在任何时刻 , 调用 reset() 方法 , 可以让 Position = Mark ;
四个属性遵循的规律 : Mark≤Position≤Limit≤CapacityMark \leq Position \leq Limit \leq CapacityMark≤Position≤Limit≤Capacity
III. Buffer 数据读写
1. Buffer 的 7 个子类 ( ByteBuffer , CharBuffer , DoubleBuffer , FloatBuffer , IntBuffer , LongBuffer , ShortBuffer ) , 都定义了两类方法 , 分别是 ① 读取数据 , ② 写入数据 ;
2. 相对操作和绝对操作 :
- ① 相对操作读写数据 : 缓冲区相对操作读取或写入数据 , 操作完毕后 , Position 被赋值为下一个将要读取或写入的元素索引 , 如果操作的 Position 超出了 Limit , 就会抛出异常 ;
- ② 绝对操作读写数据 : 直接使用元素索引进行操作 , 该操作不影响 Position 位置属性 ; 如果索引超出了缓冲区大小 , 就会抛出异常 ;
IV. Buffer 标记 mark() 和重置 reset()
标记和重置方法 :
- ① 操作对象 : 标记 mark() 方法 操作的是 Mark 标记属性 , 重置 reset() 方法 , 主要用于操作 Position 位置属性 ;
- ② 设置标记 : mark() 方法用于设置标记 , 将当前的 Position 赋值给 Mark 属性 ;
- ③ 位置重置 : reset() 方法用于重置 Position 位置属性 , 将当前的 Position 位置属性设置成 Mark 标记属性值 ;
V. Buffer 清除 翻转 重绕
1. 清除操作 : 调用 clear() 方法执行 , 执行了该方法后 , 将 Limit 限制属性设置为缓冲区的容量大小 , 将 Position 位置属性设置成 0 , 之后便可以重新从 0 位置开始读写缓冲区 ;
2. 翻转操作 : 调用 flip() 方法执行 , 执行了该方法后 , 将 Limit 限制属性设置为当前 Position 位置属性, 将 Position 位置属性设置成 0 , 之后便可以重新从 0 位置开始读写缓冲区 , 但是不能超过 Limit 位置 ;
3. 重绕操作 : 调用 rewind() 方法执行 , Limit 限制属性保持不变 , 将 Position 位置属性设置成 0 , 只是重新开始写入或读取 ;
VI. Buffer 缓冲区只读属性
Buffer 只读缓冲区 :
- ① 只读属性 : Buffer 包裹的缓冲区可能是只读的 , 不能向缓冲区中写入数据 ;
- ② 只读缓冲区操作 : 只读缓冲区的内容是不可以修改的 , 但是缓冲区的 Mark 标记 , Limit 限制 , Position 位置属性是可以改变的 , 缓冲区是只读的 , 不可改变缓冲区及其内容 , 因此 Capacity 容量不可改变 ;
- ③ 判定是否是只读缓冲区 : 可以调用 isReadOnly() 方法 , 判定该 Buffer 缓冲区是否是制度缓冲区 ;
VII. Buffer 的链式调用
1. 链式调用前提 : Buffer 缓冲区有很多方法的返回值是 Buffer 对象本身 , 如 :
- ① Buffer clear() 清除缓冲区 ,
- ② Buffer flip() 翻转缓冲区 ,
- ③ Buffer limit(int newLimit) 设置缓冲区限制 ,
- ④ Buffer mark() 设置缓冲区标记 ,
- ⑤ Buffer position(int newPosition) 设置缓冲区位置 ,
- ⑥ Buffer reset() 重置缓冲区位置 ,
- ⑦ Buffer rewind() 缓冲区重绕 ;
2.链式调用示例 :
- ① 非链式调用 :
ByteBuffer buffer = ByteBuffer.allocate(10) ;
buffer.position(3);
buffer.rewind();
buffer.limit(9);
- ② 链式调用 :
ByteBuffer buffer = ByteBuffer.allocate(10) ;
buffer.position(3).rewind().limit(9);
【Java 网络编程】NIO Buffer 简介 ( 概念 | 数据传输 | 标记 | 位置 | 限制 | 容量 | 标记 | 重置 | 清除 | 翻转 | 重绕 | 链式操作 )相关推荐
- JAVA网络编程NIO实现简易多人聊天室
BIO模型 BIO即blocking IO,顾名思义是一种阻塞模型.当没有客户端连接时,服务端会一直阻塞,当有客户端新建连接时,服务端会新开一个线程去响应(不用多线程的话服务端同一时刻最多只能接收一个 ...
- 【Java 网络编程】UDP 简介
文章目录 I UDP 简介 II UDP 不可靠性 III UDP 作用 IV UDP 报文头 V UDP 数据包长度 I UDP 简介 1. UDP : User Datagram Protocol ...
- 【Java 网络编程】TCP 简介
文章目录 I TCP 特点 II TCP 协议工作机制 III TCP传输 可靠性 IV TCP 传输稳定性 V TCP 应用场景 I TCP 特点 1. TCP 特点 : TCP 是 Transmi ...
- Java 网络编程基础知识
Java 网络编程基础知识 基础概念 计算机网络的基本概念 网络:多台计算机使用网络设备互联在一起,计算机之间可以进行通信,这样就组成了一个计算机网络. 网络设备:集线器(HUB),路由器,交 ...
- Java 网络编程系列之 NIO
Java 网络编程系列之 NIO 第 1 章Java NIO 概述 1.1 IO 概述 IO 的操作方式 1.2 阻塞 IO (BIO) 1.3 非阻塞 IO(NIO) 1.4 异步非阻塞 IO(AI ...
- NIO详解(一):java网络编程IO总结(BIO、NIO、AIO)
1.基本概念 在Java网络通信中,最基本的概念就是Socket编程了.Socket又称"套接字" 向网络发出请求或者应答网络请求. Socket 和ServerSocket类库位 ...
- Java网络编程(6)NIO - Channel详解
前言 NIO的三个核心组件:Buffer.Channel.Selector Java网络编程(4)NIO的理解与NIO的三个组件完成了大概的了解 Java网络编程(5)NIO - Buffer详解详细 ...
- Java网络编程和NIO详解开篇:Java网络编程基础
老曹眼中的网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为我们拥有网络.网络是一个神奇的东西,它改变了你和我的 ...
- Java网络编程与NIO学习总结
#Java网络编程与NIO学习总结 这篇总结主要是基于我之前Java网络编程与NIO系列文章而形成的的.主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点.谢谢 #更多详细内容可 ...
最新文章
- 记一次网络共享打印机故障
- 在虚拟机中温习DOS
- 素质教育,是救命稻草,还是压垮教培机构的最后一根稻草
- fputc会覆盖吗_深覆盖 VS 深覆合如何区分?这一篇看完就都明白了!
- 两个pdf怎么打开成两个窗口_如何将图片合并成PDF?教你两个免费方法
- 描述符、迭代器、生成器
- oracle数据库有几个服务_oracle数据库可以有几个数据库
- c++友元函数及运算符重载
- 电平转换电路_【电路】从电平角度理解数字电路
- 专业英语笔记:Install and Use Python
- Java 算法 数列
- python获取app信息的库_基于python3抓取pinpoint应用信息入库
- Python-进阶-装饰器小结
- java-pdf转word
- java爬取堆糖所有头像(高质量版头像)
- FreeWheel是一家怎样的公司?
- P1282 多米诺骨牌
- 云客服让每一个企业客户都成为座上宾
- Linux下的压测工具 hey
- ssm基于BS架构的校园爱心捐赠与物品交换平台的设计与实现毕业设计源码