Java NIO笔记(三):NIO Buffer(缓冲区)之进阶

硬件作品3----STM32F103RCT6最小系统板MCU配置 电路未调试成功,目前刚打板,后续需要补充或者改版另行注明。 阅读详情

        本节讲解NIO缓冲区(Buffer)比较底层的知识,虽然有的知识点实际用到的很少,但对理解Buffer也有一定的帮助。

        NIO缓冲区有八种缓冲区实现类,在文件IO、套接字(Socket)IO都得使用ByteBuffer来操作数据,可以说NIO中,ByteBuffer是非常核心和常用的缓冲区实现类,对ByteBuffer的实现由更深入的了解才能灵活正确的运用。

        字节(byte)是操作系统和所有I/O设备使用的基本数据类型,基本数据类型是供我们程序员来直接操作的,实际是以bit(比特位)存储在内存;那么1字节等于多少位呢?相信大家都应该知道等于八位。这里普及一下1byte等于8bit的背景,在计算机刚问世时,每个字节可以是3~12个比特位(bit),在市场的推动和前辈们的实践下,最终决定使用8位作为一个字节,因为8位足够表达英文字符集中任何一个字符,使用8位代表一个字节可以简化硬件设计,并且8位恰好可以容纳2个十六进制数字,所以8的倍数可以提供足够的组合来存储有效的数值;IBM在1960年率先推出的IBM360大型机使用的就是8位表示1字节。在这样的背景下,最终统一使用8比特位表示1字节。

一、字节顺序

        Java中有八种基本数据类型,其中除byte和boolean类型外的其他的基本数据都是由组合在一起的几个字节组成(byte是一个字节,boolean的值是true或false,而1字节的值范围是-128~127,boolean不能对应到一个或多个字节上),每个基本数据类型都是以连续字节顺序的形式存储在内存中,字节顺序分为:大端字节顺序和小端字节顺序,什么是字节顺序?多字节的数值被存储在内存的方式就是字节顺序。数值的最高字节位于低位地址,系统使用的就是大端字节顺序;数值的最低字节位于低位地址,系统使用就是小端字节顺序。例如一个int类型的数值58700999,其十六进制表示为0x037fb4c7,内存图如下:


        网络协议(Internet Protocol,即IP)规定数据必须使用大端字节顺序传输,但是有硬件使用的是小端字节顺序,所以若本地系统是小端字节顺序,就需要将多字节数值先转换成大端字节顺序后才能正确传输数据。

        在Java NIO中使用ByteOrder类来封装字节顺序,使用ByteOrder.nativeOrder()可以获取本地系统的字节顺序;ByteOrder的toString()将返回BIG_ENDIAN(大端字节顺序)或LITTLE_ENDIAN(小端字节顺序)。ByteBuffer默认使用的是大端字节顺序,和本地系统字节顺序无关,其他所有的Buffer类使用的字节顺序都和本地系统的字节顺序一致。

        NIO中所有的缓冲区类都有order()方法,其返回ByteOrder对象,通过调用ByteOrder的toString()方法便可查看某个Buffer类的字节顺序。只有ByteBuffer才可以自定义设置字节顺序,通过调用ByteBuffer的order(ByteOrder bo)方法实现。

二、直接缓冲区

        直接缓冲区是不使用JVM堆栈而是通过操作系统来创建内存块用作缓冲区。所以可以使用操作系统底层I/O,其处理数据性能要高于基于JVM堆栈的非直接缓冲区;但是直接缓冲区的创建和销毁的性能开销要低于基于JVM堆栈的非直接缓冲区。

        NIO的八种缓冲区中,只有ByteBuffer才能创建直接缓冲区(还有MappedByteBuffer?MappedByteBuffer继承ByteBuffer),通过调用ByteBuffer.allocateDirect(int capacity)来创建直接缓冲区。

        所有的缓冲区类都可以通过调用isDirect()方法来判断是否是直接缓冲区。

三、视图缓冲区

        视图缓冲区就是新创建其他的基础数据类型缓冲区,新缓冲区和源缓冲区共享数据,但各自维护自己的属性(capacity、limit、position、mark)。

        只有ByteBuffer才能创建视图缓冲区,并且可以将缓冲区的数据转成。

        视图缓冲区是基础缓冲区的一部分,由基础缓冲区的position和limit限制。创建一个ByteBuffer的CharBuffer视图,如下图:

		ByteBuffer byteBuff = ByteBuffer.allocate(6);
		byteBuff.position(2);
		byteBuff.limit(4);
		System.out.println();
		CharBuffer charBuff = byteBuff.asCharBuffer();


  • asCharBuffer()
  • asShortBuffer()
  • asIntBuffer()
  • asLongBuffer()
  • asFloatBuffer()
  • asDoubleBuffer()

四、使用ByteBuffer提供的API直接存取基础数据

  • putInt(int value)
  • putChar(char value)
  • putLong(long value)
  • putDouble(double value)
  • putShort(short value)
  • putFloat(float value)
  • getInt()
  • ......

		ByteBuffer buff = ByteBuffer.allocate(100);
		buff.putShort((short)100);
		buff.putInt(200);
		buff.putLong(300L);
		buff.putFloat(400.5f);
		buff.putDouble(500.56);
		buff.putChar('A');
		buff.flip();
		buff.getShort();//return 100
		buff.getInt();//return 200
		buff.getLong();//return 300
		buff.getFloat();//return 400.5
		buff.getDouble();//return 500.56
		buff.getChar();//return 'A'


silvaco例子库学习—mos1ex02 mos1ex02相比于第一个例子,主要进行了mos的输出特性仿真,工艺结构是一样的,所以就只简单讨论一下atlas特性仿真的部分。 阅读详情

相关推荐

Codesys电子凸轮Cam表实战:从可视化配置到程序化构建

本文详细介绍了Codesys电子凸轮Cam表的实战应用,从可视化配置到程序化构建的全过程。通过包装机和印刷机案例,解析Cam表的基础设置、调试技巧及动态构建方法,帮助工程师快速掌握电子凸轮技术,提升运动控制精度和效率。

weixin_29309785的博客 298

NIO基础介绍(二)文件通道与Buffer底层原理

Buffer: Buffer的三个重要属性:capacity, limit, position; position的值永远都不可能大于limit的值。 先定义一个容量为6的buffer,位置如图所示 如果先读入4个数据,读入完成后position的索引是4;再进行写操作,需要经过Flip:将position指向第一个进行写的位置,即0位置,limit指向原来的...

liuzewei2015的博客 570

Windows10下部署Heygem进行数字人生成

对于使用Heygem生成数字人,需要注意几个问题: + 需要使用Nvidia的显卡。 + 需要在Windows上进行本地部署。主要原因为客户端是Windows的,客户端对上传的视频写入硬编码的`D:\heygem_data\voice\data`目录,需要在容器上读取这些文件。 + 需要在Windows上部署Docker,将Windows的目录映射到容器中,由容器中的服务进行读取。 + 需要特别注意,一定要有D盘,这个D盘是Windows的D盘,不能是插入的USB设备后产生的D盘。 + 需要下载3个Doc

冀辉的博客 5620

netty—数据传输载体ByteBuf 中的getbyte()、getshort()、getint()

转载一篇文章,解决了我的一些疑惑,原文链接: https://blog.csdn.net/Qgwperfect/article/details/102492214 问题: 目前自学Netty中,正好学到数据传输载体ByteBuf的使用,对于其中的get方法获取到的值不理解。 先输入byte类型的1、2、3、4,再输入int类型的12,最后输入byte类型的5、6。 输出buffer.getByte(3)=4,这个很容易理解,接下来我就懵逼了。 输出buffer.getShort(3)=1024,why? 输

qq_37786081的博客 2378

YOLOv8n模型导出ONNX的避坑指南:解决版本差异,正确生成TensorRT/RKNN所需输出节点

本文详细介绍了YOLOv8n模型导出ONNX格式的实战避坑指南,涵盖版本差异处理、代码修改技巧及TensorRT/RKNN部署优化方案。针对不同推理框架需求,提供输出节点生成、动态轴处理和后处理划分等核心问题的解决方案,帮助开发者高效完成模型部署。

weixin_33247358的博客 357

AMDGPU驱动中Doorbell与Event机制简要对比

摘要:AMDGpu驱动中,Doorbell和Event是两种异步通知机制。Doorbell是CPU→GPU的单向硬件通知,通过写MMIO寄存器触发GPU拉取任务,延迟低且无需内核介入,适用于队列任务提交。Event是GPU→CPU的双向同步通知,基于中断和内核事件对象,支持阻塞等待,用于任务完成或异常上报。核心区别在于方向、用途和实现方式:Doorbell侧重任务触发,Event侧重状态反馈。两者配合实现高效的任务下发与完成通知流程。

图形/计算GPU的驱动与虚拟化技术分享园地 1860

java使用ByteBuffer进行多文件合并和拆分

因为验证证书的需要,需要把证书文件和公钥给到客户,考虑到多个文件交互的不便性,所以决定将2个文件合并成一个文件交互给客户。刚开始采用字符串拼接2个文件内容,但是由于是加密文件,采用字符串形式合并后,拆分后文件不可用,最后采用基于二进制流拆分和合并文件,效果不错!会正确读取到前 4 个字节,并将其转换为整数,这样你就得到了文件内容的大小。如果你按照之前的代码将文件内容合并时,将文件大小以 4 字节整数形式写入到文件中,那么你可以使用。(公钥证书内容)的长度转换为 4 个字节的整数,并写入到字节缓冲区中。

HBLOG 1302

linux mmap系统调用

brk/mmap linux 提供了两个比较重要的系统调用brk 和mmap,用于向内核申请相应用户空间,内核会根据系统运行状态判定是否申请新的VMA来管理新申请的用户空间,brk和mmap在整个系统中都占有非常重要的地位。 brk()系统调用被gblic进行了进一步封装成malloc接口,用户层程序一般都是通过调用malloc,由glibc间接调用brk来向内核申请用户空间。brk申请的用户空间属于堆空间 mmap系统调用也可以向内核申请用户空间,不过与brk不同的师,mmap申请的空间属于mma.

weixin_42730667的博客 1277

Java NIO基本组件Buffer详解

Buffer组件 对数据读取、写入要用buffer,本质就是一个数组 Buffer最常用的类 Buffer缓冲区状态变量 mark(标记):标记position位置 position(位置):当前读写的位置 limit(上界):缓冲区现存元素的计数 capacity(容量):最大容量 0 <= mark <= position <= limit <= capacity 写入缓冲区 写入一个字节,position移动1格,position就是当前写入位置 读取缓冲区 调用bu

weixin_44371237的博客 860

【ComfyUI】Z-Image 基础文生图 + 单LoRA

本文介绍了一个基于ComfyUI的Z-Image Turbo基础文生图工作流,采用轻量化UNet模型配合Qwen Image文本理解模型与LoRA风格注入,实现从文本到图像的快速生成。工作流结构清晰,包含模型加载、文本编码、采样解码等标准节点,在人物生成、构图稳定性和出图速度方面表现均衡。通过调整Prompt可控制生成内容,适合日常创作、教学演示及扩展进阶应用。

Mr数据杨 929

静态时序分析(STA)基本概念

静态时序分析中常见概念(fasle Path,multicycle path等)

m0_61544122的博客 2256

NIO Buffer 实现原理

目前很多高性能的Java RPC框架都是基于Netty实现的,而Netty的设计原理又离不开Java NIO。本篇笔记是对NIO核心三件套:缓冲区(Buffer)、选择器 (Selector)和通道(Channel),其中之一的实现原理的学习总结。

兴趣使然的草帽路飞 1万+

AI + 药物临床试验研发赛道

研究日期:2026-07-09 | 研究主题:AI + 药物临床试验研发赛道 | 聚焦岗位:Agent 平台架构师 / AI 工程架构师。

AI天才研究院 146

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

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

热带鱼的技术博客 2261

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

qq_62636650的博客 1564

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java NIO三大核心之缓冲区Buffer概述

定义 缓冲区Buffer在java nio中负责数据的存储,缓冲区就是数组,用于存储不同类型数据的数组。 jdk为java七大基本类型数据都准备了响应的缓冲区(boolean值除外): ByteBuffer CharBuffer ShortBuffer IntegerBuffer LongBuffer FloatBuffer DoubleBuffer 上述缓冲区除了ByteBuffer的 功能稍微多点外,因为ByteBuffer是通用的,所以功能会比较多。其他6种的使用方式几乎是一致的。 /* * B

lixinkuan的博客 3770

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入学习NIO三大核心:缓冲区 Buffer、通道Channel、Selector选择器

通道(Channel)是java.nio的第二个创建概念。Channel用于在缓冲区和位于通道另一侧的实体(通常是一个文件或者是一个套接字)之间有效的传输数据。只不过Channel本身不能直接访问数据,Channel只能和Buffer进行交互。NIO的通道和流的区别通道可以同时进行读写,但是流只能读或者只能写通道可以实现异步读写数据通道可以从缓冲读取数据,也可以写数据到缓冲区;BIO中的stream是单向的,

weixin_39038328的博客 1962

Java NIO之缓冲区Buffer分析

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

梦悠哉的博客 1740

Java NIO ———— Buffer 缓冲区详解

引言 缓冲区是一个用于特定基本类型的容器。由java.nio 包定义,所有缓冲区都是 Buffer 抽象类的子类。 Java NIO 中的 Buffer ,主要用于与NIO 通道进行交互。数据从通道存入缓冲区,从缓冲区取出到通道中。 一、创建缓冲区 缓冲区的本质是数组,用于存储不同类型的数据,根据数据类型(boolean 除外),提供了相应类型的缓冲区,如ByteBuffer、In...

Morty的技术乐园 2450

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

三、Java NIO Buffer

Java NIO Buffer

梦想成真 763

《Java源码解析》NIO中Buffer缓冲区的实现

Buffer 缓冲区Java的NIO中Buffer至关重要:buffer是读写的中介,主要和NIO的通道交互。数据是通过通道读入缓冲区和从缓冲区写入通道的。其实缓冲区buffer的本质就是一块可以读写的内存块。这块内存块被包装成NIO的Buffer对象,并提供了一组方法方便读写。3.1 Buffer的基本用法:使用Buffer读写数据一般是下面步骤: 1. 写入数据到Buffer 2. 调用fl

惜暮 2480

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

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

ystyaoshengting的专栏 590

NIO学习笔记——缓冲区(Buffer)详解

缓冲区是包在一个对象内的基本数据元素数组,Buffer类相比一个简单的数组的优点是它将关于数据的数据内容和信息包含在一个单一的对象中。Buffer的属性容量(capacity):缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,并且永远不能被改变 上界(limit):缓冲区的第一个不能被读或写的元素。或者说,缓冲区中现存元素的计数 位置(position):下一个要被读或写的元素

路漫漫,水迢迢 8463
上一篇: Java NIO笔记(二):NIO Buffer(缓冲区)之基础
下一篇: Java NIO笔记(四):ByteBuffer存取无符号数值
xlight2023
博客等级 码龄15年 236粉丝 32原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值