关于NIO中的Buffer缓冲区

自动控制原理之控制系统的数学模型(类比神经网络学习数学模型) 控制系统的数学模型背景建模方法常用的数学模型时域数学模型的建立建立微分方程的步骤复数域模型的建立传递函数的性质系统的典型环节及传递函数比例环节惯性环节积分环节微分环节理想微分环节一阶微分环节二阶微分环节振荡环节延时环节(时滞环节) 背景 数学模型就像是真实世界的写照,它就像一个虚拟的世界,我们可以通过建模的方式了解这个真实世界的运作规律。 这一点很像强化学习,强化学习需要一个供智能体探索、学习的环境,于是,我们通常会事先建立一个虚拟的仿真环境。举个例子,对于人类来说,可能需要经过不断地尝试,甚至是生命的代价 阅读详情

Buffer是一个对象,它包含一些要写入或者读取的数据。在NIO类库中加入Buffer对象,体现了新库与原IO的一个重要的区别。在面向流的IO中,可以将数据直接写入或者读取到Stream对象中。在NIO库中,所有的数据都是用缓冲区处理的(读写)。缓冲区实质上是一个数组,通常它是一个字节数组(ByteBuffer),也可以使用其他类型的数组。这个数组为缓冲区提供了数据的访问读写等操作属性,如位置、容量、上限等概念,可以参考一下API文档。

Buffer类型:我们最常用的就是ByteBuffer,实际上每一种java的基本类型都对应着一种缓冲区(除了Boolean类型)

ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer。

下面我们以IntBuffer来举例怎么使用缓冲区,因为每一种Buffer的使用都是差不多滴。

1、基本操作
//创建指定长度的缓冲区
IntBuffer buf = IntBuffer.allocate(10);
//positoin表示当前位置
buf.put(11); //添加后,position由0变为1
buf.put(22);  //position位置: 1->2
buf.put(33);  //position位置: 2->3
//flip方法会将position位置复位为0 也就是3->0
buf.flip();
System.out.println("使用flip复位后:"+buf);
System.out.println("缓冲区容量为:"+buf.capacity()); //容量一旦初始化后不允许改变(warp方法包裹数组除外)
System.out.println("缓冲区的限制为:"+buf.limit());//由于只装载了三个元素,所以可读取或者操作的元素为3,则limit=3
		
System.out.println("获取下标为1的元素:"+buf.get(1));
System.out.println("get(index)方法获取后,position位置不变:"+buf);
buf.put(1,12);  //会覆盖原来index为1的值
System.out.println("put(index,change)方法添加后,position位置不变:"+buf);
for(int i=0;i<buf.limit();i++){
	//调用get方法会使其缓冲区位置(position)向后递增一位
	//如果上面没有调用flip复位position是会报错的
	System.out.print(buf.get()+"\t");
}
System.out.println("buf对象遍历之后:"+buf);
执行结果:
使用flip复位后:java.nio.HeapIntBuffer[pos=0 lim=3 cap=10]
缓冲区容量为:10
缓冲区的限制为:3
获取下标为1的元素:22
get(index)方法获取后,position位置不变:java.nio.HeapIntBuffer[pos=0 lim=3 cap=10]
put(index,change)方法添加后,position位置不变:java.nio.HeapIntBuffer[pos=0 lim=3 cap=10]
11	12	33	buf对象遍历之后:java.nio.HeapIntBuffer[pos=3 lim=3 cap=10]
总结:我们需要注意的是position位置。每用put(value)方法添加元素到缓冲区,positon都会加1。而get()方法,不是get(index),是根据position位置来获取缓冲区的元素的。如果一共有10个元素,但是position此时为3,那么就是从index为3的位置开始获取,而每次调用完get()方法后,position会后移一位。而get(index)不需要理会position,因为会根据传入的index获取。


2、wrap包裹方法:wrap方法会包裹一个数组:一般这种用法不会先初始化缓存对象的长度,因为是没有意义的,最后缓冲区会被wrap所包裹的数组覆盖掉,并且wrap方法修改缓冲区对象的时候,数组本身会跟着发生变化
int[] arr = new int[]{1,2,3};
IntBuffer buf = IntBuffer.wrap(arr);
System.out.println("wrap(arr)方法的缓冲区:"+buf);
buf.put(1, 6); //将缓冲区index为1的数据修改为6
System.out.println(arr[1]); //发现,数组indexi为1也确实被改为6了

执行结果:

wrap(arr)方法的缓冲区:java.nio.HeapIntBuffer[pos=0 lim=3 cap=3]
6
wrap(arr,offset,length)方法的缓冲区:java.nio.HeapIntBuffer[pos=0 lim=2 cap=3]
需要注意的是:我们可以看到wrap方法如果带上包裹的初始位置和长度,那么litmit就会是可操作元素的个数,而不是被包裹数组的长度了

3、其他方法

IntBuffer buf = IntBuffer.allocate(10);
int[] arr = new int[]{1,2,3};
buf.put(arr);
System.out.println(buf);
//复制方法
IntBuffer buf2 = buf.duplicate();
System.out.println("复制后的新缓冲区:"+buf2);
		
//设置position的方法
System.out.println("设置position前的缓冲区:"+buf);
//可读数据是直接调用get()方法能获取饿数据,而不是get(index)方法
//此时因为调用过put将数组添加到缓冲区,而数组的个数是3,所以position此时肯定是为3的
//而IntBuffer初始化的长度为10,所以可读数据个数应该为7
System.out.println("重新设置position之前的可读数据个数:"+buf.remaining());
System.out.println();
buf.position(1);
System.out.println("设置position后的缓冲区:"+buf);
//重新设置后的position为1,所以可读数据个数为9
System.out.println("重新设置position之后的可读数据个数:"+buf.remaining());
			
//将缓冲区的数据放入数组里面
int[] arr2 = new int[buf.remaining()];
buf.get(arr2);  
//由于上面是重新设置position为1,所以是将1及1之后的元素放入数组里面
//所以数组里面会有9个元素
for(int i : arr2){
	System.out.println(Integer.toString(i)+",");
}

执行结果:

java.nio.HeapIntBuffer[pos=3 lim=10 cap=10]
复制后的新缓冲区:java.nio.HeapIntBuffer[pos=3 lim=10 cap=10]

设置position前的缓冲区:java.nio.HeapIntBuffer[pos=3 lim=10 cap=10]
重新设置position之前的可读数据个数:7
设置position后的缓冲区:java.nio.HeapIntBuffer[pos=1 lim=10 cap=10]
重新设置position之后的可读数据个数:9

2,
3,
0,
0,
0,
0,
0,
0,
0,


Python办公自动化 2.1开发环境搭建:PyCharm社区版配置Anaconda开发环境 本篇文章主要讲述了如何在windows主机上配置 PyCharm + Anaconda开发环境、以及了如何配置 PyQt界面开发环境,安装过程超级详细,初学者可以照着一步一步来! 阅读详情

相关推荐

PlutoSDR在matlab中的环境配置(包括驱动和硬件支持包)

双击下载到的驱动,除了点击接受协议和设置安装路径,其他只要点击下一步或者安装即可。登录或者注册你的账号,选择你的matlab版本(这里我的是2023b),点击下一步。设置安装路径,并选择我接受,点击下一步,即可安装完成,并在安装路径中得到。完成后,打开设备管理器,在端口和通用串行总线设备一栏,即可看见下图。点击进入,选择相应的系统安装包,这里我选择的Windows。可看到我们要安装的Pluto支持包,安装即可。右击桌面matlab,选择打开文件所在位置。右上角搜索pluto,选择并点击下一步。

weixin_53160338的博客 4867

【Java.NIO】API —— Buffer接口

java.nio包提供了Buffer API,使得Java程序可以直接控制和运用缓冲区。 java.nio public abstract class Buffer extends Object 所有的缓冲区都有以下属性: capacity - 表示该缓冲区可以保存多少数据,该值不为负且指定后保持不变limit - 不为负且不大于capacity;为不能读写的第一个元素的索引值;

王晓斌的专栏 2066

Centos7安装Tesseract5.5.0+SpringBoot集成部署(离线版)

Java 中实现 OCR(光学字符识别)功能,可以使用 Tesseract OCR,这是一个开源的 OCR 引擎,支持多种语言,并且可以在 Java 中通过 Tesseract API 进行集成。

Leopard锋的博客 2320

理解NIO核心概念——Buffer

缓冲区本质上是一块可读写的内存。这块内存被包装成Buffer对象,并从Buffer派生一系列具体类型的子类(除boolean外),这些类提供了一组方法,用于操作该块内存。派生关系如下图: 使用缓冲区一般遵循以下四个步骤: 写数据到Buffer 调用flip()方法:主动将Buffer从写模式切换成读模式 从Buffer中读数据 调用clear()方法或者compact()方法 clear():清空缓冲区 compact():清除已经读过的数据 为了更容易理解Buffer,需要先理解下面4个核心技

MaiDouYT的博客 329

VMware Workstation Pro 17 最新破解版安装教程(附永久激活密钥)

本文详细介绍了VMware Workstation Pro 17专业版的安装与配置指南,包括系统要求检查、官方版本安装流程、高级配置优化及常见问题排查。通过合规使用官方版本,开发者可以充分利用其强大的虚拟化能力,提升多平台开发与测试效率。

weixin_29327977的博客 3557

Cursor Agent模式下如何优雅切换conda环境运行Python脚本?3种实用方法实测

本文针对Cursor Agent模式下运行Python脚本时环境错配的痛点,实测了三种优雅切换conda环境的实用方法。通过Shell全局配置、项目级.cursorrc文件定制以及对话中直接指令,开发者可以确保AI助手在正确的虚拟环境中执行代码,从而提升开发效率和协作流畅度。

redis7keeper的博客 597

NIO概述及Buffer的基本使用

NIO概述 java.nio全称Java non-blocking IO或Java New IO,是从jdk1.4 开始引入的一套新的IO api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供同步非阻塞式的高伸缩性网络。 NIO核心组成部分: Buffer:缓冲区 Channel:通道 Selector:选择器(轮询器) NIO和IO的...

qq_45337431的博客 425

Matlab:imageDatastore() 高效读取图像数据集的实战技巧

本文详细介绍了Matlab中imageDatastore()函数的高效使用技巧,帮助用户从繁琐的手动读取图像数据集中解放出来。通过核心语法、关键参数(如IncludeSubfolders、LabelSource、ReadSize)的解析,以及数据集分割、打乱等进阶实战操作,指导读者构建稳定、高效的图像数据读取管道,特别适用于大型图像数据集处理和机器学习项目。

hill8的博客 1101

网络编程(3)——NIO

概念 缓冲区Buffer 管道、通道Channel。 数据是从Channel流到 选择器、多路复用器Selector NIO的本质就是避免原始的TCP建立连接使用3次握手的操作,减少连接的开销 NIO概念模型 1. Buffer Buffer是一个对象,它包含一些要写入或者要读取的数据。在NIO类库中加入Buffer对象,体现了新库与原IO的一个重要的区别。在面向流的IO中(...

想当厨子的程序媛 593

手把手教你构建轻量级CLIP模型:从理论到实践

本文手把手教你从零构建一个轻量级CLIP模型,深入解析其核心原理——对比学习,并提供完整的代码实践。通过精简的模型架构、数据准备和训练循环实现,帮助读者彻底理解多模态模型如何让图像与文本在共享空间中对齐,为学习更复杂的AI模型打下坚实基础。

weixin_29100927的博客 326

PHP 网页游戏开发入门教程

我们还链接了一个名为 “game.js” 的 JavaScript 文件,稍后将在其中编写游戏逻辑。这只是一个简单的示例,但它演示了如何使用 PHP 和 JavaScript 开发一个基本的网页游戏。以下是一个示例游戏的源代码和解释。现在,您可以在浏览器中打开 “game.php” 文件,即可看到一个带有红色游戏角色的游戏板。在上述代码中,我们使用 JavaScript 创建了一个游戏角色元素,并将其添加到游戏板容器中。最后,我们需要将游戏元素的样式设置为绝对定位,以便能够正确地控制它们的位置。

KkowServer的博客 678

【计算机IO系类】Java NIO

NIO 主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统 IO 基于字节流和字

qq_35789269的博客 240

T113-S3-RTL8211网口phy芯片调试

在嵌入式系统开发中,网络连接是至关重要的一部分。T113-S3开发板搭载了RTL8211系列的网口PHY芯片,用于实现以太网连接。在开发过程中,对于网口的稳定性和性能的调试至关重要。本篇博客将介绍如何调试T113-S3开发板中的RTL8211网口PHY芯片,以确保网络连接的正常工作。

flypig has a dream! 4614

Java 入门指南:Java NIO —— Buffer(缓冲区)

在 NIO(New Input/Output)模型中,Buffer 是一个重要的概念,与数据打交道,用于在内存中存储数据。通过 Channel 将数据传输到 Buffer 缓冲区中,并在缓冲区内进行数据的读写操作。 Buffer 本质上是一个数组,可以存储多个相同类型的基本数据类型,如 byte、short、int、long、float、double 等。Buffer 封装了内部的数组,并提供了一些操作该数组的方法。

热带鱼的技术博客 2261

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

NIO——02缓冲区Buffer

一、缓冲区  缓冲区(Buffer)是一个用于存取特定基本数据类型数据的容器,底层是这些基本数据类型的数组,由java.nio包定义,所有缓冲区都是Buffer抽象类的子类。主要用于与NIO通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的。  根据数据类型不同,NIO提供了以下类型的Buffer:   ByteBuffer   CharBuffer   ShortBuffer   Int...

如不來的博客 444

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java NIO的Buffer缓冲区和Channel通道详细总结

NIO 主要有在 NIO 中,并不是以流的方式来处理数据的,而是以 buffer 缓冲区和 Channel 通道来处理数据的。可以简单理解为把Channel通道比作 铁路,buffer缓冲区比作成火车(运载着货物),而NIO就是通过来实现数据的处理。Buffer 是缓冲区的抽象类,ByteBuffer 是(在通道中读写字节数据):拿到一个缓冲区我们往往会做什么?很简单,就是。所以,缓冲区的核心方法就是 put 和 get:Buffer 类维护了 4 个核心变量来提供。get()put()现在,怎么拿呀。

qq_62636650的博客 1564

Java NIO之缓冲区Buffer

NIO与IO的区别 由面向存取数据的载体、是否阻塞等可以分为以下三点不同: 面向流: 数据像水流一样传输,并且,要么输入要么输出,流是单向的。所以以前的IO流都有输入流,输出流。 面向缓冲区: NIO会在程序与文件(磁盘、网络)之间建立一个通道用于连接,然后通过缓冲区进行数据存取,通过通道进行连接传递。 阻塞IO和非阻塞IO、选择器主要是针对网络编程而言的。 通道( Ch...

ystyaoshengting的专栏 590

Java NIO之缓冲区Buffer分析

目录 Buffer介绍 ByteBuffer介绍 ByteBuffer案例 总结 Buffer介绍 1.Buffer简介       缓冲区(Buffer)是中NIO中基础的内容,存在于包java.nio下面.一个Buffer对象可以看做是一个存储数据的容器,数据被存储到这里后可以进行检索。缓冲区工作与通道关联,我们不与通道直接进行交互,而是通过缓冲区将数据传送到通道里,或者从通道获...

梦悠哉的博客 1740

Java-NIO之Buffer(缓冲区)

Buffer 是什么 Buffer(缓冲区)本质上是一个由基本类型数组构成的容器。 我们先看看Buffer类的基本构成: public abstract class Buffer { // Invariants: mark <= position <= limit <= capacity private int mark = -1; private int position = 0; private int limit; private in

HongYu012的博客 1038

java之NIO缓冲区Buffer的使用

 先说说传统io和Nio的区别 看如下两个图,传统的io传输是直接面对的流,面对的数据进行传输的,并且每个流都是单向的,得建立输入流输出流,但是NIO它建立的通道是双向的,程序直接面对的不是这个通道,而是缓冲区,这个缓冲区就相当于火车,通道是铁路,程序面对的是火车,往火车中存取数据,并且之建立一个通道就可以了,这就是它们之间的一个区别. 先了解一下缓冲区  * 缓存区(Buffer)...

kxj19980524的博客 293

NIO之Buffer缓冲区

NIO简介 Java.nio全称Java non-blocking IO或Java New IO,是从jdk1.4 开始引入的一套新的IO api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。 ​ IO操作的模式: ​ PIO(Programing IO): 所有的IO操作由CPU处理,CPU占用率比较高 ...

ShawnaVayne_的博客 535

java NIO入门篇——缓冲区Buffer

文章目录什么是缓冲区?缓冲区的使用1.allocate、put、flip、get、rewind、clear2.mark3.直接缓冲区总结 什么是缓冲区? java 传统I/O将输入输入抽象为字节流或字符流,是基于单个字节的,优点是使用简单,缺点就是效率低下。而且IO的各种流是阻塞的。当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入,在此期间不能再...

qq_43615903的博客 549

Java NIO Buffer 缓冲区

本文介绍了 Java NIO 中 Buffer(缓冲区)的相关内容。。。

Regino的博客 457

java笔记--NIO基础--Buffer缓冲区

注意,执行完写操作后想要进行读之前,要执行filp()方法翻转:limit = position;| 使用 | put/get/channel 读写 | 不走 JVM 堆,效率高 || 释放 | 依赖 GC 和 Cleaner | 不可手动释放,不能频繁创建 || native 分配堆外内存 |

lxq6966892的博客 1246

Java NIO——缓冲区Buffer

目录什么是Java NIO 什么是Java NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。 Java NIO系统的核心在于:通道(Channel)和缓冲区(Buffer)。通道表示打开到 IO 设备(例如:文件、套接字)的连接。若需要使用 NIO 系统,需要获取用于连接 I

guochaoHNU的博客 1127

NIO技术精讲之缓冲区Buffer

1. 缓冲区Buffer NIO中的buffer是一个用于存储基本数据类型值的容器。在使用传统I/O流API时,如InputStream和OutputStream,我们常常把字节流的数据放入byte[]字节数组中,或放入char[]字符数组中进行读写操作,这种处理方式处理比较原始。NIO中为我们提供了缓冲区Buffer类来解决,它还有很多其他方法。 1.1 认识Buffer 这个类小伙伴们平时开发...

ChinaCR07的博客 654

Day387.Buffer缓冲区 -NIO

Java NIO(Buffer) 1.1 Buffer 简介 Java NIO 中的 Buffer 用于和 NIO 通道进行交互。数据是从通道读入缓冲区,从缓冲区写入到通道中的。 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成 NIO Buffer 对象,并提供了一组方法,用来方便的访问该块内存。 缓冲区实际上是一个容器对象,更直接的说,其实就是一个数组,在 NIO 库中,所有数据都是用缓冲区处理的。 在读取数据时,它是直接读到缓冲区中的; 在写入数据时,它也是写入到缓冲区中

阿昌爱Java 903
上一篇: 关于读写锁-ReentrantReadWriteLock
下一篇: NIO的Selector介绍和例子代码
Howinfun
博客等级 码龄10年 165粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值