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

  1. Java NIO 三大组件之 Buffer

    NIO大三组件 之Buffer 一.什么是Buffer Buffer是用于特定原始类型的数据的容器. 它的实质就是一组数组,用于存储不同类型的数据. 二.缓冲区的类型 缓冲区类型除了Boolean值类 ...

  2. NIO三大组件简介

    NIO简介 NIO 是面向缓冲区(或者说面向块)编程的, 因为Buffer底层本质上就是内存块.数据被读取到一个缓冲区, 稍后再被它处理, 需要时数据可在缓冲区前后移动, 从而增加了处理过程中的灵活性 ...

  3. 第一章 java nio三大组件与使用姿势

    本案例来源于<netty权威指南> 一.三大组件 Selector:多路复用器.轮询注册在其上的Channel,当发现某个或者多个Channel处于“就绪状态”后(accept接收连接事件 ...

  4. NIO - 三大组件

    NIO 概述 NIO有三个核心组件: 通道(Channels) 缓存(Buffers) 选择器(Selectors) 实际上,NIO的组件和类远不止这三个,但这个三个组件是核心.至于其它组件,例如Pi ...

  5. Java NIO 三大组件之 Channel

    Java NIO 之 Channel 一.什么是Channel Channel用于源节点(例如磁盘)与目的节点的连接,它可以进行读取,写入,映射和读/写文件等操作. 在Java NIO中负责缓冲区中数 ...

  6. Netty学习笔记(1)NIO三大组件

    1. Channel channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前 ...

  7. NIO三大组件之Selector选择器

    什么是选择器 选择器的作用是完成IO的多路复用.一个通道代表一条连接通路,通过选择器可以同时监控多个通道的IO(输入输出)状况.选择器和通道的关系,是监控和被监控的关系. 使用 重要的成员 Selec ...

  8. Java网络编程和NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector

    Java网络编程与NIO详解4:浅析NIO包中的Buffer.Channel 和 Selector 转自https://www.javadoop.com/post/nio-and-aio 本系列文章首 ...

  9. Java网络编程与NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector

    微信公众号[黄小斜]作者是蚂蚁金服 JAVA 工程师,目前在蚂蚁财富负责后端开发工作,专注于 JAVA 后端技术栈,同时也懂点投资理财,坚持学习和写作,用大厂程序员的视角解读技术与互联网,我的世界里不 ...

随机推荐

  1. CentOS7安装配置 NFS

    一.NFS 简介 NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端N ...

  2. ArcGIS处理栅格数据(三)

    六.制作镶嵌数据集(栅格数据集优点:a.浏览速度快:b.入库速度快:c.可指定区域显示) 1.右键目录中的数据库,新建"镶嵌数据集". 2.添加栅格数据. 3.定义金字塔. 4.构 ...

  3. 3.keepalived+脚本实现nginx高可用

    标题 : 3.keepalived+脚本实现nginx高可用 目录 : Nginx 序号 : 3 else exit 0 fi else exit 0 fi - 需要保证脚本有执行权限,可以使用chm ...

  4. HTTP1.0和HTTP1.1以及HTTP2.0的区别

    (1)连接方面 HTTP1.0使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象.每次请求和响应都需要建立一个单独的连接,每次连接只是传输一个对象,严重影响客户机和服务器的性能. H ...

  5. Linux 应用开发----socket编程笔记

    Linux socket编程 套接字定义描述 套接字的域 AF_INET ====>IPv4 AF_INET6 ====>IPv6 AF_UNIX ====>unix 域 AF_UP ...

  6. Linux 驱动框架---驱动中的阻塞

    描述和API 阻塞IO和非阻塞IO的应用编程时的处理机制是不同的,如果是非阻塞IO在访问资源未就绪时就直接返回-EAGAIN,反之阻塞IO则会使当前用户进程睡眠直到资源可用.从应用场景来说两种方式分别 ...

  7. HTML5 动画效果的多种实现方式

    HTML5 动画效果的多种实现方式 1.  CSS3 transform + transition https://www.w3.org/TR/css-transforms-1/ https://ww ...

  8. React Hooks: useCallback All In One

    React Hooks: useCallback All In One useCallback https://reactjs.org/docs/hooks-reference.html#usecal ...

  9. Web Components & HTML5 & template & slot

    Web Components & HTML5 & template & slot https://developer.mozilla.org/en-US/docs/Web/HT ...

  10. auto scroll bottom in js

    auto scroll bottom in js autoScrollToBottom() { let box = document.querySelector(`[data-dom="ch ...