NIO三大组件之Buffer
什么是Buffer
Buffer(这里并不是特指Buffer类)是一个存储数据的容器,与数组类似(其实底层依旧是用数组的结构来存储数据),但不同的是,Buffer对象提供了一组更有效的方法去进行写入和读取的交替访问
Buffer类的特性
线程安全性
Buffer是线程不安全的,所以如果有多于一个线程去访问,那么需要手动加上同步操作
关键属性
capacity
是Buffer对象的能容纳的最大的元素个数(类似于数组的长度,但不一定是字节数组),不能为负,不能改变
limit
是第一个不能够被读或者被写的元素的位置(即能够被读和写的最大元素个数),要小于等于capacity
例如,在默认情况下limit=capacity,当capacity=10时,limit=10说明有索引0-9是可以访问的,也可以把limit理解为可以访问的元素的个数
position
是当前可以读取或者写入的元素的位置,要小于等于limit
在写入模式时,position初始为0,每有一个数据写入,则后移一位,最大值为limit-1
比如limit限制为10,则可以访问的索引为0-9共十个数,那么当position=9时是可写的,但当position=10时,就不可写了;
在读入模式时,position也是默认从零开始,但是由于调用flip()时会把position赋值给limit,所以position<=limit
例如当写入模式已经写入了index为9的元素,position此时为10,读状态时limit也为10
mark
可以暂时存储所需要的position的值,方便以后回到此位置,与其名字一样,起到标记的作用
0 <= mark <= position <= limit <= capacity
关键方法
flip
用于将写模式转换为读模式
 public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }
clean
 public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }
可以看出来,虽然名字叫做clean,但却没有真的去清除数据,只是改变了position和limit而已,却在事实上与清除数据有同样的效果,同时将读模式转换为写模式
compact
这个方法也可以把读模式变成写模式
reset
此方法把position恢复到mark的位置上
public final Buffer reset() {
        int m = mark;
        if (m < 0)
            throw new InvalidMarkException();
        position = m;
        return this;
    }
rewind
表示将之前的数据再读一次
其实这几个方法主要都是limit,position与mark这三个变量的值的转换
分类
所有的xxxBuffer类都继承了Buffer类,有各种原生类的buffer,其中byte类型的buffer又根据字符编码分为多种,但所有这些类都是抽象类或者不能直接从外部访问的类
而我们所使用的类一般都是以direct或者heap开头的实现类.这也是allocate()方法的返回值
这里以ByteBuffer源码为例
 public static ByteBuffer allocateDirect(int capacity) {
        return new DirectByteBuffer(capacity);
    }
public static ByteBuffer allocate(int capacity) {
        if (capacity < 0)
            throw new IllegalArgumentException();
        return new HeapByteBuffer(capacity, capacity);
    }
问题
Java NIO中是怎么判断一个buffer是读模式还是写模式的呢?
NIO三大组件之Buffer的更多相关文章
- Java NIO 三大组件之 Buffer
		
NIO大三组件 之Buffer 一.什么是Buffer Buffer是用于特定原始类型的数据的容器. 它的实质就是一组数组,用于存储不同类型的数据. 二.缓冲区的类型 缓冲区类型除了Boolean值类 ...
 - NIO三大组件简介
		
NIO简介 NIO 是面向缓冲区(或者说面向块)编程的, 因为Buffer底层本质上就是内存块.数据被读取到一个缓冲区, 稍后再被它处理, 需要时数据可在缓冲区前后移动, 从而增加了处理过程中的灵活性 ...
 - 第一章 java nio三大组件与使用姿势
		
本案例来源于<netty权威指南> 一.三大组件 Selector:多路复用器.轮询注册在其上的Channel,当发现某个或者多个Channel处于“就绪状态”后(accept接收连接事件 ...
 - NIO - 三大组件
		
NIO 概述 NIO有三个核心组件: 通道(Channels) 缓存(Buffers) 选择器(Selectors) 实际上,NIO的组件和类远不止这三个,但这个三个组件是核心.至于其它组件,例如Pi ...
 - Java NIO 三大组件之 Channel
		
Java NIO 之 Channel 一.什么是Channel Channel用于源节点(例如磁盘)与目的节点的连接,它可以进行读取,写入,映射和读/写文件等操作. 在Java NIO中负责缓冲区中数 ...
 - Netty学习笔记(1)NIO三大组件
		
1. Channel channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前 ...
 - NIO三大组件之Selector选择器
		
什么是选择器 选择器的作用是完成IO的多路复用.一个通道代表一条连接通路,通过选择器可以同时监控多个通道的IO(输入输出)状况.选择器和通道的关系,是监控和被监控的关系. 使用 重要的成员 Selec ...
 - Java网络编程和NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector
		
Java网络编程与NIO详解4:浅析NIO包中的Buffer.Channel 和 Selector 转自https://www.javadoop.com/post/nio-and-aio 本系列文章首 ...
 - Java网络编程与NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector
		
微信公众号[黄小斜]作者是蚂蚁金服 JAVA 工程师,目前在蚂蚁财富负责后端开发工作,专注于 JAVA 后端技术栈,同时也懂点投资理财,坚持学习和写作,用大厂程序员的视角解读技术与互联网,我的世界里不 ...
 
随机推荐
- CentOS7安装配置 NFS
			
一.NFS 简介 NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端N ...
 - ArcGIS处理栅格数据(三)
			
六.制作镶嵌数据集(栅格数据集优点:a.浏览速度快:b.入库速度快:c.可指定区域显示) 1.右键目录中的数据库,新建"镶嵌数据集". 2.添加栅格数据. 3.定义金字塔. 4.构 ...
 - 3.keepalived+脚本实现nginx高可用
			
标题 : 3.keepalived+脚本实现nginx高可用 目录 : Nginx 序号 : 3 else exit 0 fi else exit 0 fi - 需要保证脚本有执行权限,可以使用chm ...
 - HTTP1.0和HTTP1.1以及HTTP2.0的区别
			
(1)连接方面 HTTP1.0使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象.每次请求和响应都需要建立一个单独的连接,每次连接只是传输一个对象,严重影响客户机和服务器的性能. H ...
 - Linux 应用开发----socket编程笔记
			
Linux socket编程 套接字定义描述 套接字的域 AF_INET ====>IPv4 AF_INET6 ====>IPv6 AF_UNIX ====>unix 域 AF_UP ...
 - Linux 驱动框架---驱动中的阻塞
			
描述和API 阻塞IO和非阻塞IO的应用编程时的处理机制是不同的,如果是非阻塞IO在访问资源未就绪时就直接返回-EAGAIN,反之阻塞IO则会使当前用户进程睡眠直到资源可用.从应用场景来说两种方式分别 ...
 - HTML5 动画效果的多种实现方式
			
HTML5 动画效果的多种实现方式 1. CSS3 transform + transition https://www.w3.org/TR/css-transforms-1/ https://ww ...
 - React Hooks: useCallback All In One
			
React Hooks: useCallback All In One useCallback https://reactjs.org/docs/hooks-reference.html#usecal ...
 - Web Components & HTML5 & template & slot
			
Web Components & HTML5 & template & slot https://developer.mozilla.org/en-US/docs/Web/HT ...
 - auto scroll bottom in js
			
auto scroll bottom in js autoScrollToBottom() { let box = document.querySelector(`[data-dom="ch ...