文章目录

  • 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 简介 ( 概念 | 数据传输 | 标记 | 位置 | 限制 | 容量 | 标记 | 重置 | 清除 | 翻转 | 重绕 | 链式操作 )相关推荐

  1. JAVA网络编程NIO实现简易多人聊天室

    BIO模型 BIO即blocking IO,顾名思义是一种阻塞模型.当没有客户端连接时,服务端会一直阻塞,当有客户端新建连接时,服务端会新开一个线程去响应(不用多线程的话服务端同一时刻最多只能接收一个 ...

  2. 【Java 网络编程】UDP 简介

    文章目录 I UDP 简介 II UDP 不可靠性 III UDP 作用 IV UDP 报文头 V UDP 数据包长度 I UDP 简介 1. UDP : User Datagram Protocol ...

  3. 【Java 网络编程】TCP 简介

    文章目录 I TCP 特点 II TCP 协议工作机制 III TCP传输 可靠性 IV TCP 传输稳定性 V TCP 应用场景 I TCP 特点 1. TCP 特点 : TCP 是 Transmi ...

  4. Java 网络编程基础知识

    Java 网络编程基础知识 基础概念 计算机网络的基本概念 ​ 网络:多台计算机使用网络设备互联在一起,计算机之间可以进行通信,这样就组成了一个计算机网络. ​ 网络设备:集线器(HUB),路由器,交 ...

  5. Java 网络编程系列之 NIO

    Java 网络编程系列之 NIO 第 1 章Java NIO 概述 1.1 IO 概述 IO 的操作方式 1.2 阻塞 IO (BIO) 1.3 非阻塞 IO(NIO) 1.4 异步非阻塞 IO(AI ...

  6. NIO详解(一):java网络编程IO总结(BIO、NIO、AIO)

    1.基本概念 在Java网络通信中,最基本的概念就是Socket编程了.Socket又称"套接字" 向网络发出请求或者应答网络请求. Socket 和ServerSocket类库位 ...

  7. Java网络编程(6)NIO - Channel详解

    前言 NIO的三个核心组件:Buffer.Channel.Selector Java网络编程(4)NIO的理解与NIO的三个组件完成了大概的了解 Java网络编程(5)NIO - Buffer详解详细 ...

  8. Java网络编程和NIO详解开篇:Java网络编程基础

    老曹眼中的网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为我们拥有网络.网络是一个神奇的东西,它改变了你和我的 ...

  9. Java网络编程与NIO学习总结

    #Java网络编程与NIO学习总结 这篇总结主要是基于我之前Java网络编程与NIO系列文章而形成的的.主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点.谢谢 #更多详细内容可 ...

最新文章

  1. 记一次网络共享打印机故障
  2. 在虚拟机中温习DOS
  3. 素质教育,是救命稻草,还是压垮教培机构的最后一根稻草
  4. fputc会覆盖吗_深覆盖 VS 深覆合如何区分?这一篇看完就都明白了!
  5. 两个pdf怎么打开成两个窗口_如何将图片合并成PDF?教你两个免费方法
  6. 描述符、迭代器、生成器
  7. oracle数据库有几个服务_oracle数据库可以有几个数据库
  8. c++友元函数及运算符重载
  9. 电平转换电路_【电路】从电平角度理解数字电路
  10. 专业英语笔记:Install and Use Python
  11. Java 算法 数列
  12. python获取app信息的库_基于python3抓取pinpoint应用信息入库
  13. Python-进阶-装饰器小结
  14. java-pdf转word
  15. java爬取堆糖所有头像(高质量版头像)
  16. FreeWheel是一家怎样的公司?
  17. P1282 多米诺骨牌
  18. 云客服让每一个企业客户都成为座上宾
  19. Linux下的压测工具 hey
  20. ssm基于BS架构的校园爱心捐赠与物品交换平台的设计与实现毕业设计源码

热门文章

  1. NAT概念解释(不完全版,但不会搞错...)
  2. win10+ubuntu14.04双系统硬盘安装教程
  3. 搞不懂的算法-排序篇1
  4. 《JavaScript高级程序设计 第3版》-学习笔记-1
  5. Linq to objects示例
  6. C# 入门经典示例.
  7. shell脚本[] [[]] -n -z 的含义解析
  8. Python网络编程:IO多路复用
  9. Memcached源码分析
  10. 小型软件项目开发流程探讨