Buffer是一个用于特定基本类型数据的容器, 是特定基本类型元素的线性有限序列,对于每个非 boolean 基本类型,此类都有一个子类与之对应。Buffer非线程安全。类图如下:
一、属性
- mark,用于标记一个位置,配合reset()使用,初始值-1,调用mark()后将值设置为当前position的值。
- position,下一个读或者写的位置。
- limit,第一个不能读取或写入元素的位置。
- capacity ,缓冲区的容量。
四者之间的关系:mark <= position <= limit <= capacity。
二、构造Buffer
Buffer有两种构造模式,分只读Buffer和可读写Buffer,只读Buffer从可读写Buffer上调用asReadOnlyBuffer方法得到。其一是非直接模式,在虚拟机堆上构建Buffer,具体实现类为HeapXXXBuffer、HeapXXXBufferR(只读Buffer),其内有一个基本类型的数组,以及一个偏移量offset,代表Buffer使用数组从offset位置开始,到数组结束位置的数据空间。
- 调用allocate创建,在堆上创建一个基本类型的数组来维护数据。
- 调用wrap创建,包装一个已有的基本类型数组来维护数据。
其二是直接模式,直接的操作系统内存中分配缓存,调用allocateDirect方法创建。建议将直接缓冲区主要分配给那些易受本机 I/O 操作影响的大型、持久的缓冲区。一般情况下,最好仅在直接缓冲区能在程序性能方面带来明显好处时分配它们。
三、API
- capacity,返回缓冲区容量。
- clear,清空缓存区,设置position = 0 limit = capacity mark = -1;
- flip,反转缓存区,切换到读模式,设置limit = position position = 0 mark = -1
- limit,返回缓冲区limit值。
- limit(int newLimit),设置limit值。
- mark,设置标志位,mark = position
- position,返回position的值。
- position(int newPosition),设置position的值。
- remaining,返回缓冲区剩余可用空间大小,返回值为limit - position。
- hasRemaining,返回是否还有可用空间,return position < limit。
- reset,将position重置到标志位mark,设置position = mark。
- rewind,重绕此缓冲区,设置 position = 0 mark = -1,调用此方法是在limit被设置为恰当值的前提下,通常用于重新读取已经被flip的buffer。
四、数据操作
-
读取数据:通过get(),get(index)。get()从position位置读取,position值加一;get(index)从index位置读取,不改变position。
-
写入数据: 通过put(byte),put(index,byte)。put(byte)写入position位置,position值加一;put(index,byte)写入index位置,不改变position。
-
批量读取数据:get(XXX[] dst),get(XXX[] dst, int offset, int length)。
- 批量写入数据:put(XXXBuffer src),put(XXX[] src, int offset, int length),put(byte[] src)
相关推荐
Java NIO Buffer 过程详解 Java NIO Buffer 是 Java NIO 中的一种重要组件,负责数据的存储和传输。缓冲区是数组,用于存储不同数据类型的数据。在与 NIO 通道交互时,Java NIO Buffer plays a crucial role. 基本...
这个压缩包“动态演示nio中的buffer相关操作.zip”显然是为了帮助用户直观地理解NIO Buffer的工作机制,通过动态演示来展示Buffer如何存储、读取和传输数据。 在Java NIO中,Buffer是一个特定类型的数组,用于临时...
尚硅谷_NIO_缓冲区(Buffer)的数据存取 ·03. 尚硅谷_NIO_直接缓冲区与非直接缓冲区 ·04. 尚硅谷_NIO_通道(Channel)的原理与获取 ·05. 尚硅谷_NIO_通道的数据传输与内存映射文件 ·06. 尚硅谷_NIO_分散读取与聚集...
### NIO:Channel、Buffer与Selector详解 #### 一、NIO概述 NIO(Non-blocking I/O,非阻塞I/O)是Java为了解决传统阻塞式I/O效率低下的问题而引入的一种新的I/O操作模式。NIO通过引入Channel、Buffer以及Selector...
Buffer是Java NIO中最基本的概念之一,用于在Java NIO中存储不同类型的数据。缓冲区实际上是一块可以读写的内存空间,这块内存空间被封装成NIO Buffer对象,它支持数据的读写操作,并且可以通过flip()方法在读模式和...
JAVA NIO之Buffer(缓冲区)详解 JAVA NIO之Buffer(缓冲区)是Java NIO中一个重要的概念,它提供了一种高效的数据处理方式。缓冲区是一个可以写入数据然后从中读取数据的内存块,它被包装成NIO Buffer对象,并...
12-Java NIO-Buffer-概述.mp4 13-Java NIO-Buffer-基本使用.mp4 14-Java NIO-Buffer-三个属性和类型.mp4 17-Java NIO-Buffer-缓冲区分片.mp4 18-Java NIO-Buffer-只读缓冲区.mp4 19-Java NIO-Buffer-直接缓冲区.mp4 ...
【Netty面试专题1】 ...Netty 提供了高度可定制的 ByteBuf 替代了标准的 Java NIO Buffer,使得内存管理更加灵活高效。同时,Netty 的 Pipeline 模式允许开发者自定义事件处理流程,简化了复杂的网络编程。
书中会介绍Channel、Selector、Buffer等NIO核心组件,并展示如何在Netty中使用它们。 接着,书中会深入讲解Netty的EventLoop和EventLoopGroup。EventLoop是Netty中的工作线程,负责处理I/O事件和执行用户定义的任务...
- **ByteBuf**:Netty自定义的缓冲区,提供了比Java NIO Buffer更高效和方便的API。 - **EventLoop(事件循环)**:Netty中的Reactor模型实现,单个线程处理多个任务,避免了线程上下文切换的开销。 - **...
Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六) Selector Java NIO系列教程(七) FileChannel Java NIO系列教程(八) ...
此外,书中还会介绍Netty的内存管理策略,如ByteBuf,它是Netty对Java NIO Buffer的增强,提供了更高效的数据传输方式。 通过阅读这本书,你可以了解到Netty如何处理并发连接,以及其强大的异常处理机制。Netty的...
77_Java NIO Buffer总结回顾与难点拓展 78_Netty数据容器ByteBuf底层数据结构深度剖析 79_Netty的ByteBuf底层实现大揭秘 80_Netty复合缓冲区详解与3种缓冲区适用场景分析 81_Netty引用计数的实现机制与自旋锁的使用...
32_IO体系架构系统回顾与装饰模式的具体应用 33_Java NIO深入详解与体系分析 34_Buffer中各重要状态属性的含义与关系图解 35_Java NIO核心类源码解读与分析 36_文件通道用法详解 37_Buffer深入详解 38_NIO堆外内存与...
第77讲:Java NIO Buffer总结回顾与难点拓展 第78讲:Netty数据容器ByteBuf底层数据结构深度剖析 第79讲:Netty的ByteBuf底层实现大揭秘 第80讲:Netty复合缓冲区详解与3种缓冲区适用场景分析 第81讲:Netty引用...
Java NIO库提供了多种实现,如`java.nio.channels`包下的各种Channel和Selector类,以及`java.nio`包下的Buffer类。 在学习NIO时,首先需要理解Channel、Buffer、Selector的基本概念和使用方法,然后通过实例来熟悉...
此外,Netty的ByteBuf是高效的数据缓冲区,提供了比Java NIO Buffer更友好的API。它支持预读和后写,可以在不复制数据的情况下进行读写操作,从而提高了性能。 书中的代码案例会涵盖如何创建服务器、建立连接、处理...