Java基础之《netty(3)—NIO之Buffer》

news2025/1/21 12:18:06

一、Buffer基本介绍

1、缓冲区(Buffer)
缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(数组)。该对象提供了一组方法,可以更轻松的使用内存块。缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer。

二、Buffer类

1、Buffer类定义了所有的缓冲区都具有四个属性来提供关于其包含的数据元素的信息
Capacity:容量,即可以容纳的最大数据量,在缓冲区创建时被设定并且不能改变。
Limit:表示缓冲区的当前终点,不能对缓冲区超过极限的位置进行读写操作。且极限是可以修改的。
Position:位置,下一个要被读或写的元素的索引,每次读写缓冲区数据时都会改变该值,为下次读写做准备。
Mark:标记,调用mark()来设置mark=position,再调用reset()可以让position恢复到标记的位置。

2、相关代码

    // Invariants: mark <= position <= limit <= capacity
    private int mark = -1;
    private int position = 0;
    private int limit;
    private int capacity;

3、Buffer的子类
在NIO中,Buffer是一个顶层父类,它是一个抽象类。

IntBuffer也有相应的子类:

4、Buffer简单使用

package netty.nio;

import java.nio.IntBuffer;

public class BasicBuffer {
	public static void main(String[] args) {
		//举例说明buffer的使用(简单说明)
		
		//创建一个Buffer,大小为5,即可以存放5个int
		IntBuffer intBuffer = IntBuffer.allocate(5);
		
		//向Buffer存放数据
		//intBuffer.capacity:buffer的容量
		for (int i=0; i < intBuffer.capacity(); i++) {
			intBuffer.put(i * 2);
		}
		
		//如何从buffer读取数据
		//将buffer转换,读写切换
		intBuffer.flip();
		
		
		while(intBuffer.hasRemaining()) {  //是否有未读数据
			System.out.println(intBuffer.get());  //通过buffer的index获取数据
		}
	}
}

debug中可以看到:

5、读写切换

    public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }

6、Buffer类相关方法一览
(1)JDK1.4时,引入的api
public final int capacity():返回此缓冲区的容量
public final int position():返回此缓冲区的位置
public final Buffer position(int newPosition):设置此缓冲区的位置
public final int limit():返回此缓冲区的限制
public final Buffer limit(int newLimit):设置此缓冲区的限制

public final Buffer mark():在此缓冲区的位置设置标记
public final Buffer reset():将此缓冲区的位置重置为以前标记的位置
public final Buffer clear():清除此缓冲区,即将各个标记恢复到初始状态,但是数据并没有真正擦除
public final Buffer flip():反转此缓冲区
public final Buffer rewind():重绕此缓冲区
public final int remaining():返回当前位置与限制之间的元素数
public final boolean hasRemaining():告知在当前位置和限制之间是否有元素
public abstract boolean isReadOnly():告知此缓冲区是否为只读缓冲区
(2)JDK1.6时,引入的api
public abstract boolean hasArray():告知此缓冲区是否具有可访问的底层实现数组
public abstract Object array():返回此缓冲区的底层实现数组
public abstract int arrayOffset():返回此缓冲区底层实现数组中第一个缓冲区元素的偏移量
public abstract boolean isDirect():告知此缓冲区是否为直接缓冲区
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑盒子问题

一 问题描述 黑盒子代表一个原始数据库&#xff0c;存储一个整数数组和一个特殊的 i 变量。最初的时刻&#xff0c;黑盒子是空的&#xff0c;i0&#xff0c;黑盒子处理一系列命令&#xff08;事务&#xff09;。有两种类型的事务。 ① ADD(x)&#xff0c;将元素 x 放入黑盒子…

按用户导出数据到asm磁盘组,并复制到另一个集群的asm

1.创建asm导出数据目录 sql>select name,total_mb,free_mb from v$asm_diskgroup; 确认集群asm磁盘组环境 asmcmd>cd DGDSDB asmcmd>mkdir dpbak asmcmd>ls -l sql>conn / as sysdba create directory expdp_asm_dir as DGDSDB/dpbak; create directory expdp_l…

堆-c语言实现

1. 树是什么&#xff1f; 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合 注意&#xff1a;根结点没有前驱结点&#xff1b;每棵子树的跟结点有且只有一个前驱结点&#xff0c;可能有0个或者多个后继结点&am…

数学建模学习(108):帮助小白快速实现批量机器学习建模训练和批量的数据可视化

本文主要针对机器学习知识薄弱,不太擅长搭建模型同学使用。 本文主要是讲解可以快速轻松实现可视化、数据预处理、批量模型构建。帮助大家轻松做到可视化和建模。特别是机器学习不扎实同学。 数据科学模型开发管道涉及各种组件,包括数据收集、数据处理、探索性数据分析、建模…

unity il2cpp打包安卓打包崩溃原因Unity2020.3 il2cpp.so丢失

Unity2020.3 il2cpp.so 问题&#xff1a;升级unity2020.3后&#xff0c;使用il2cpp方式打Android包&#xff0c;在手机上启动会崩溃&#xff0c;追查崩溃原因是il2cpp.so not found。 解决过程&#xff1a; il2cpp.so没有&#xff1f;一脸懵逼&#xff01;记得以前在调用Bui…

面试八股 | 计算机网络 | TCP三次握手

CP三次握手和四次挥手是面试题的热门考点&#xff0c;它们分别对应TCP的连接和释放过程&#xff0c;今天我们先来认识一下TCP三次握手过程&#xff0c;以及是否可以使用“两报文握手”建立连接。1、TCP是什么&#xff1f; TCP是面向连接的协议&#xff0c;它基于运输连接来传送…

【附源码】计算机毕业设计JAVA养老机构系统

【附源码】计算机毕业设计JAVA养老机构系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA mybati…

国际物流和跨境电商物流的区别

跨境物流是将货物通过海、陆、空运输从一个国家运输到另一个国家或地区&#xff0c;最终完成交易的目的。国际物流是实现两地对物资进行物理移动的一项国际商品交易或交流活动&#xff0c;从而完成国际商品交易的终目的。二者说法不同而已&#xff0c;本质上两者并没有太大的区…

APAUNet

Title:APAUNet: Axis Projection Attention UNet for Small Target in 3D Medical Segmentation 摘要&#xff1a; 在医学分割中&#xff0c;小目标分割对于诊断至关重要。在本文提出了轴向投影注意力网络&#xff0c;用于三维医学图像分割&#xff0c;特别是小目标。考虑到背…

什么是PCB中的光学定位点,不加可不可以?

什么是PCB中的光学定位点&#xff0c;不加可不可以&#xff1f; 这个问题在我平时的教学答疑出现的频次非常高&#xff0c;很多新手在初次接触这个概念的时候往往分不清楚这个光学定位点作用什么&#xff1f;从而导致他根本不知道什么时候该加&#xff0c;什么时候不加。 今天我…

物流通知:您的快递即刻送达!

“双11”购物狂欢节刚刚过去 “双12”马上就要到啦&#xff01; 回想双11期间 隔日达、次日达的快递 让买买买的快乐直接翻倍 也大大提升了消费者们 双12的再消费欲望 飞奔的物流背后有什么秘密武器&#xff1f; 来跟着小翼一探究竟&#xff01; 物流行业的飞速发展给…

Android App开发之利用JNI实现加密和解密操作实战(附源码 简单易懂)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、JNI实现加密和解密 在实际开发中 JNI主要应用于以下场景 1&#xff1a;对关键业务数据进行加密和解密 Java代码容易遭到破解&#xff0c;JNI加密更加安全 2&#xff1a;底层的网络操作与设备操作 Java作为一门高级…

智慧农业建设方案中的物联网技术

物联网即“物物相联之网”,指通过射频识别&#xff08;RFID&#xff09;、红外感应器、全球定位系统、激光扫描器等信息传感设备&#xff0c;按约定的协议&#xff0c;把物与物&#xff0c;人与物进行智能化连接&#xff0c;进行信息交换和通讯&#xff0c;以实现智能化识别、定…

一分钟给大量视频褪色并加马赛克

剪辑视频的时候&#xff0c;想给大量的视频进行褪色处理&#xff0c;并且添加马赛克&#xff0c;可以用什么简单的操作方法吗&#xff1f;今天小编就来给大家安利一个可以快速批量这样进行操作的方法&#xff0c;下面就来看看具体的操作吧&#xff01; 首先大家在浏览器搜索下载…

【VTK+有限元后处理】节点属性值查询

功能 有限元在后处理过程中&#xff0c;我们如果想获取某一个节点的属性数据值&#xff0c;最直接的方法就是点击这个节点&#xff0c;然后显示其属性数据。 代码实现 首先我们需要使用到VTK的点拾取类vtkPointPicker类。 从需求可知&#xff0c;我们需要与窗口进行交互&am…

STM32开发_利用SPI协议读写SD卡、介绍SD卡SPI时序

一、​ SD卡引脚接口功能介绍 1.1 SD卡引脚 目录 一、​ SD卡引脚接口功能介绍 1.1 SD卡引脚接口图 1.2 SPI方式驱动SD卡介绍 1.3 开发板接口定义 二、MMC卡、SD卡介绍 2.1 SD卡和MMC两者间区别 2.2 SD卡版本说明 2.3 SD卡常用的指令表 三、向SD卡发送命令的步骤介…

【数据结构】堆的拓展延伸 —— 堆排序 和 TopK问题

文章目录前言堆排序TopK问题结语前言 上篇博客&#xff0c;我们实现了堆。那么堆到底有什么应用情景&#xff1f;今天的内容就是堆的两个应用&#xff0c;堆排序和TopK问题。话不多说&#xff0c;我们这就开始。 堆排序 堆排序&#xff0c;是根据堆的结构而设计出的一种排序…

Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks

原文链接&#xff1a;https://aclanthology.org/D19-1410.pdf 概述 问题&#xff1a; BERT和RoBERT模型在进行语义匹配的时候&#xff0c;需要将每个可能的组合都输入到模型中&#xff0c;会带来大量的计算&#xff08;因为BERT模型对于句子对的输入&#xff0c;使用[SEP]来标记…

C++11、17、20的内存管理-指针、智能指针和内存池从基础到实战(中)

C11、17、20的内存管理-指针、智能指针和内存池从基础到实战&#xff08;中&#xff09;第三章 分配器allocator和new重载1、重载operator的new和delete包括数组如果我们访问的是一个数组2、类成员操作符new重载和放置placement_newplacement new&#xff08;放置内存&#xff…

并发编程(三)原子性(1)

【认识原子性】&#xff1a; 一个小程序认识原子性&#xff1a; package T05_YuanZiXing;import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class T00_00_IPlusPlus {private …