什么是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. OpenStack Train版-7.neutron网络服务概述

    网络服务NEUTRON概述 一.NEUTRON架构 OpenStack的网络服务neutron是整个OpenStack中最复杂的一个部分,它的基本架构是一个中心服务(neutron-server)外加 ...

  2. Service Cloud 零基础(四)快速配置一个问卷调查(无开发)

    本篇参考:https://trailhead.salesforce.com/content/learn/modules/survey-basics 我们在工作和生活中会经历过形形色色得调查问卷,有一些 ...

  3. MarkDown语法详解

    MarkDown语法详解 编辑器:Typora 下载官网:https://typora.io 提速镜像:https://gitee.com/typora-mirror/Typora-Mirror/re ...

  4. 免费在线 Linux Desktop 环境

    免费在线 Linux Desktop 环境 Run Linux OS Distributions online https://www.onworks.net/os-distributions 免费测 ...

  5. Promise nested then execute order All In One

    Promise nested then execute order All In One Promise nested then nested Promise not return new Promi ...

  6. node.js delete directory & file system

    node.js delete directory & file system delete a not empty directory https://nodejs.org/api/fs.ht ...

  7. Electron All In One

    Electron All In One desktop app https://www.electronjs.org/docs/api/browser-window BrowserWindow 创建和 ...

  8. js & for & for of & for in & forEach, break

    js & for & for of & for in & forEach, break js for break https://stackoverflow.com/q ...

  9. 大胆预计SPC算力空投收益,月收益22.8%

    此前,NGK官方公告表示,NGK算力持有者获得SPC的数量是根据200万枚SPC除以全网算力总量决定的. 举个例子,假设全网算力总量为500万,那么每个算力持有者如果持有一个算力,则可获得200万÷5 ...

  10. .NET探索模型路由约定实现伪静态

    概述 IPageRouteModelConvention接口用于自定义PageRouteModel,这个对象在Microsoft.AspNetCore.Mvc.ApplicationModels命名空 ...