ByteBuffer学习总结

Java ByteBuffer使用全解析 ByteBuffer是 Java NIO(New I/O)库中的一个类,用于处理字节数据。它提供了一种灵活且高效的方式来操作字节缓冲区,适用于处理大量的字节数据,例如文件 I/O、网络通信等。ByteBufferByteBuffer有一个固定的容量,一旦分配,就不能更改。可以通过allocate静态方法或wrap静态方法来创建一个ByteBuffer。// 分配 1024 字节的缓冲区ByteBuffer有一个位置和限制的概念,它们用于跟踪读写的位置。position表示下一个要读写的位置,而limit。 阅读详情

学习文档:https://zhidao.baidu.com/question/427134449349230532.html

                   https://blog.youkuaiyun.com/z69183787/article/details/77102198/

说道 ByteBuffer的缓冲区,就需要知道缓冲区的的三个状态
1)capacity    即容量,也就是缓冲区的大小。它的值是在创建缓冲区的时候指定的,设定后无法对其进行修改。 
2)limit 读写限制:也就是缓冲区可以利用(进行读写)的范围的最大值,可以调用ByteBuffer对象的limit(int)方法进行设置,
调用ByteBuffer对象的limit()获取缓冲区读写限制的大小;在刚开始创建缓冲区的时候limit的大小等于capacity。 
3)position 读写位置:表示当前进行读写操作时的位置,初始化为0,即缓冲区开始读或者写数据的位置。
可以通过调用ByteBuffer对象的positon(int)方法设置它的值,通过position()可以获取它的值

这三个状态的数值满足一下关系:0=<position=<limit=<capacity  
   
在初始化缓冲区的情况下,position=0;limit = capacity     
                                                           
缓冲区是通过put或者putXXX来向缓冲区添加数据,也可以通过put(index,vlaue)方法在指定的position和limit之间指定的地方添加数据;
通过get()或者getXXX()来获取数据,也可以通过get(int  index)方法来获取position到limit之间指定的数据。 
注意position的位置会随着数据的写入而移或者读取一个字节一个字节的移动(比如添加一个byte类型的数据position会+1,
添加一个int类型的数据position会+4;),直到position=limit为止。如果position==limit时,
再添加数据会报java.nio.BufferOverflowException、再获取数据会报java.lang.IndexOutOfBoundsException。       
正因为向缓冲区添加数据的时候写数据的时候position会变化,如果想获取缓冲区的数据直接调用get等相关方法获取数据是肯定不行的,
因为此时数据在缓冲区存在数据的部分是0~~position之间,而读数据开始的位置position在此区间之外。
所以要获取此区间的数据需要重新设置position的位置,ByteBuffer提供了一个flip方法,
该方法主要进行两部操作 limit = position;(将limit设为当前position) position =0; 
此时通过get方法就可以获取到0到limit之间的数据了

以下代码修改至  http://www.cnblogs.com/guazi/p/6474757.html
public static void main(String[] args) {
        ByteBuffer buff = ByteBuffer.allocate(1024);
        String str = "helloWorld";
        buff.put(str.getBytes());
        System.out.println(new String(buff.array()));
        System.out.println("position:" + buff.position() + "\t limit:"
                + buff.limit() + "\t capacity:" + buff.capacity());
        // 读取两个字节byte[] abytes = new byte[1];
        byte[] abytes = new byte[1];
        buff.get(abytes);
        System.out.println("get one byte to string:" + new String(abytes));
        // Reads the byte at this buffer's current position, and then increments
        // the position.
        buff.get();
        System.out.println("获取两个字节(两次get()方法调用)后");
        System.out.println("position:" + buff.position() + "\t limit:"
                + buff.limit());
        // Sets this buffer's mark at its position. like
        // ByteBuffer.this.mark=position
        buff.mark();
        System.out.println("mark()...");
        System.out.println("position:" + buff.position() + "\t limit:"
                + buff.limit());

        // 当读取到码流后,进行解码。首先对ByteBuffer进行flip操作,
        // 它的作用是将缓冲区当前的limit设置为position,position设置为0
        // flip方法将Buffer从写模式切换到读模式。调用flip()方法会将position设回0,并将limit设置成之前position的值。
        buff.flip();
        System.out.println("flip()...");
        System.out.println("position:" + buff.position() + "\t limit:"
                + buff.limit() + "\t capacity:" + buff.capacity());

        byte[] tbyte = new byte[buff.limit()];
        buff.get(tbyte);
        System.out.println("get one byte to string:" + new String(tbyte));
        System.out.println("position:" + buff.position() + "\t limit:"
                + buff.limit());
        if (buff.hasRemaining()) {
            buff.compact();
        } else {
            buff.clear();
        }
    }

 

 

缓冲区(Buffer)

缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区:

使用缓冲区有这么两个好处:

1、减少实际的物理读写次数

2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数

举个简单的例子,比如A地有1w块砖要搬到B地

由于没有工具(缓冲区),我们一次只能搬一本,那么就要搬1w次(实际读写次数)

如果A,B两地距离很远的话(IO性能消耗),那么性能消耗将会很大

但是要是此时我们有辆大卡车(缓冲区),一次可运5000本,那么2次就够了

相比之前,性能肯定是大大提高了。

而且一般在实际过程中,我们一般是先将文件读入内存,再从内存写出到别的地方

这样在输入输出过程中我们都可以用缓存来提升IO性能。

所以,buffer在IO中很重要。在旧I/O类库中(相对java.nio包)中的BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter在其实现中都运用了缓冲区。java.nio包公开了Buffer API,使得Java程序可以直接控制和运用缓冲区。

在Java NIO中,缓冲区的作用也是用来临时存储数据,可以理解为是I/O操作中数据的中转站。缓冲区直接为通道(Channel)服务,写入数据到通道或从通道读取数据,这样的操利用缓冲区数据来传递就可以达到对数据高效处理的目的。在NIO中主要有八种缓冲区类(其中MappedByteBuffer是专门用于内存映射的一种ByteBuffer):

Fields

所有缓冲区都有4个属性:capacity、limit、position、mark,并遵循:mark <= position <= limit <= capacity,下表格是对着4个属性的解释:

属性 描述

Capacity容量,即可以容纳的最大数据量;在缓冲区创建时被设定并且不能改变
Limit表示缓冲区的当前终点,不能对缓冲区超过极限的位置进行读写操作。且极限是可以修改的
Position位置,下一个要被读或写的元素的索引,每次读写缓冲区数据时都会改变改值,为下次读写作准备
Mark标记,调用mark()来设置mark=position,再调用reset()可以让position恢复到标记的位置

Methods

 

1、实例化

java.nio.Buffer类是一个抽象类,不能被实例化。Buffer类的直接子类,如ByteBuffer等也是抽象类,所以也不能被实例化。

但是ByteBuffer类提供了4个静态工厂方法来获得ByteBuffer的实例:

方法 描述

allocate(int capacity)从堆空间中分配一个容量大小为capacity的byte数组作为缓冲区的byte数据存储器
allocateDirect(int capacity)是不使用JVM堆栈而是通过操作系统来创建内存块用作缓冲区,它与当前操作系统能够更好的耦合,因此能进一步提高I/O操作速度。但是分配直接缓冲区的系统开销很大,因此只有在缓冲区较大并长期存在,或者需要经常重用时,才使用这种缓冲区
wrap(byte[] array)这个缓冲区的数据会存放在byte数组中,bytes数组或buff缓冲区任何一方中数据的改动都会影响另一方。其实ByteBuffer底层本来就有一个bytes数组负责来保存buffer缓冲区中的数据,通过allocate方法系统会帮你构造一个byte数组
wrap(byte[] array,
 int offset, int length)

在上一个方法的基础上可以指定偏移量和长度,这个offset也就是包装后byteBuffer的position,而length呢就是limit-position的大小,从而我们可以得到limit的位置为length+position(offset)

我写了这几个方法的测试方法,大家可以运行起来更容易理解

	public static void main(String args[]) throws FileNotFoundException {
 
		System.out.println("----------Test allocate--------");
		System.out.println("before alocate:"
				+ Runtime.getRuntime().freeMemory());
		
		// 如果分配的内存过小,调用Runtime.getRuntime().freeMemory()大小不会变化?
		// 要超过多少内存大小JVM才能感觉到?
		ByteBuffer buffer = ByteBuffer.allocate(102400);
		System.out.println("buffer = " + buffer);
		
		System.out.println("after alocate:"
				+ Runtime.getRuntime().freeMemory());
		
		// 这部分直接用的系统内存,所以对JVM的内存没有影响
		ByteBuffer directBuffer = ByteBuffer.allocateDirect(102400);
		System.out.println("directBuffer = " + directBuffer);
		System.out.println("after direct alocate:"
				+ Runtime.getRuntime().freeMemory());
		
		System.out.println("----------Test wrap--------");
		byte[] bytes = new byte[32];
		buffer = ByteBuffer.wrap(bytes);
		System.out.println(buffer);
		
		buffer = ByteBuffer.wrap(bytes, 10, 10);
		System.out.println(buffer);	
	}

 

2、另外一些常用的方法

方法    描述

limit(), limit(10)等其中读取和设置这4个属性的方法的命名和jQuery中的val(),val(10)类似,一个负责get,一个负责set
reset()把position设置成mark的值,相当于之前做过一个标记,现在要退回到之前标记的地方
clear()position = 0;limit = capacity;mark = -1; 有点初始化的味道,但是并不影响底层byte数组的内容
flip()limit = position;position = 0;mark = -1; 翻转,也就是让flip之后的position到limit这块区域变成之前的0到position这块,翻转就是将一个处于存数据状态的缓冲区变为一个处于准备取数据的状态
rewind()把position设为0,mark设为-1,不改变limit的值
remaining()return limit - position; 返回limit和position之间相对位置差
hasRemaining()return position < limit返回是否还有未读内容
compact()把从position到limit中的内容移到0到limit-position的区域内,position和limit的取值也分别变成limit-position、capacity。如果先将positon设置到limit,再compact,那么相当于clear()
get()相对读,从position位置读取一个byte,并将position+1,为下次读写作准备
get(int index)绝对读,读取byteBuffer底层的bytes中下标为index的byte,不改变position
get(byte[] dst, int offset, int length)从position位置开始相对读,读length个byte,并写入dst下标从offset到offset+length的区域
put(byte b)相对写,向position的位置写入一个byte,并将postion+1,为下次读写作准备
put(int index, byte b)绝对写,向byteBuffer底层的bytes中下标为index的位置插入byte b,不改变position
put(ByteBuffer src)
用相对写,把src中可读的部分(也就是position到limit)写入此byteBuffer

 
put(byte[] src, int offset, int length)从src数组中的offset到offset+length区域读取数据并使用相对写写入此byteBuffer
方法描述


一下是测试方法;

	public static void main(String args[]){
 
		System.out.println("--------Test reset----------");
		buffer.clear();
		buffer.position(5);
		buffer.mark();
		buffer.position(10);
		System.out.println("before reset:" + buffer);
		buffer.reset();
		System.out.println("after reset:" + buffer);
 
		System.out.println("--------Test rewind--------");
		buffer.clear();
		buffer.position(10);
		buffer.limit(15);
		System.out.println("before rewind:" + buffer);
		buffer.rewind();
		System.out.println("before rewind:" + buffer);
 
		System.out.println("--------Test compact--------");
		buffer.clear();
		buffer.put("abcd".getBytes());
		System.out.println("before compact:" + buffer);
		System.out.println(new String(buffer.array()));
		buffer.flip();
		System.out.println("after flip:" + buffer);
		System.out.println((char) buffer.get());
		System.out.println((char) buffer.get());
		System.out.println((char) buffer.get());
		System.out.println("after three gets:" + buffer);
		System.out.println("\t" + new String(buffer.array()));
		buffer.compact();
		System.out.println("after compact:" + buffer);
		System.out.println("\t" + new String(buffer.array()));
 
		System.out.println("------Test get-------------");
		buffer = ByteBuffer.allocate(32);
		buffer.put((byte) 'a').put((byte) 'b').put((byte) 'c').put((byte) 'd')
				.put((byte) 'e').put((byte) 'f');
		System.out.println("before flip()" + buffer);
		// 转换为读取模式
		buffer.flip();
		System.out.println("before get():" + buffer);
		System.out.println((char) buffer.get());
		System.out.println("after get():" + buffer);
		// get(index)不影响position的值
		System.out.println((char) buffer.get(2));
		System.out.println("after get(index):" + buffer);
		byte[] dst = new byte[10];
		buffer.get(dst, 0, 2);
		System.out.println("after get(dst, 0, 2):" + buffer);
		System.out.println("\t dst:" + new String(dst));
		System.out.println("buffer now is:" + buffer);
		System.out.println("\t" + new String(buffer.array()));
 
		System.out.println("--------Test put-------");
		ByteBuffer bb = ByteBuffer.allocate(32);
		System.out.println("before put(byte):" + bb);
		System.out.println("after put(byte):" + bb.put((byte) 'z'));
		System.out.println("\t" + bb.put(2, (byte) 'c'));
		// put(2,(byte) 'c')不改变position的位置
		System.out.println("after put(2,(byte) 'c'):" + bb);
		System.out.println("\t" + new String(bb.array()));
		// 这里的buffer是 abcdef[pos=3 lim=6 cap=32]
		bb.put(buffer);
		System.out.println("after put(buffer):" + bb);
		System.out.println("\t" + new String(bb.array()));
	}

 

88. ByteBuffer 使用方法 ByteBuffer 是 Java NIO(New I/O)包中的一个核心类,用于高效处理二进制数据。它本质上是一个字节缓冲区,提供对原始字节的读写操作,并支持多种数据类型的转换(如 int、float 等)。ByteBuffer 是 Java NIO(New I/O)包中的一个核心类,用于高效地处理字节数据。它提供了一种在内存中存储和操作字节数据的方式,支持直接内存和堆内存两种分配方式。普通数组:Java 中的基本数据结构,用于存储固定大小的同类型元素(如byte[]ByteBuffer。 阅读详情

相关推荐

ByteBuffer 用法详解

ByteBuffer 是 Java NIO 中用于处理字节数据的关键类,提供了比传统 byte[] 更灵活和高效的字节操作方式。

Shrimp_millet 1239

一文搞懂ByteBuffer使用与原理

已知NIOChannelBuffer和Selector。那么Buffer的作用就是提供一个缓冲区,用于用户程序和Channel之间进行数据读写,也就是用户程序中可以使用Buffer向Channel写入数据,也可以使用Buffer从Channel读取数据。ByteBuffer是Buffer子类,是字节缓冲区,特点如下所示。大小不可变。一旦创建,无法改变其容量大小,无法扩容或者缩容;读写灵活。内部通过指针移动来实现灵活读写;支持堆上内存分配和直接内存分配。本文将对ByteBuffer的相关概念,常用。

m0_71777195的博客 5720

手把手教你用Cursor + 自定义MCP工具链,让AI帮你搞定App逆向(附adb-mcp/frida-mcp源码)

本文详细介绍了如何利用Cursor IDE与自定义MCP工具链构建AI驱动的App逆向工作流,涵盖adb-mcp和frida-mcp的源码实现与实战应用。通过自然语言指令,AI可自动化完成设备控制、动态Hook和数据分析,显著提升移动安全测试效率。适合安全研究人员和开发者快速掌握智能逆向技术。

weixin_33737134的博客 1303

ByteBuffer的原理和使用详解

ByteBuffer的原理和使用详解1.ByteBuffer的2种创建方式2.字符串转成ByteBuffer的3三种方式3.Bytebuffer的读写底层原理 ByteBuffer是字节缓冲区,主要用户读取和缓存字节数据,多用于网络编程,Netty框架的重要知识点 1.ByteBuffer的2种创建方式 1.ByteBuffer buf = ByteBuffer.allocate(int size); 方式1的buf缓冲区存储在堆内存中,内存开销在JVM中,受GC影响,会多拷贝一次,因为java程序收到的数

TheWayForDream 2894

AI智能体Codex实战:外贸客户开发自动化,85家精准客户深度分析

如果你在外贸行业,特别是工业品领域,一定遇到过这样的困境:想开发海外客户,但不知道从何下手。Google搜索出来的要么是B2B平台上的老面孔,要么是信息残缺的过时黄页。手动筛选、整理、验证,一个客户信息就要花上半小时,效率低得让人抓狂。 更头疼的是,好不容易找到一些公司名称,却不知道他们的采购决策人是谁、公司规模如何、业务是否匹配。传统的客户开发就像大海捞针,投入大量时间成本,回报却充满不确定性。 今天要介绍的这个工具,可能会彻底改变你的工作流。它不是另一个CRM软件,而是一个基于AI的智能客户开发与情报分

weixin_29054399的博客 348

最新Docker GPU支持全解析:为什么nvidia-smi能用但PyTorch找不到CUDA?

本文深入解析了Docker容器中nvidia-smi命令可用但PyTorch无法调用CUDA的根本原因。关键在于默认配置仅暴露了GPU的utility管理能力,而CUDA计算所需的compute能力未被激活。通过正确设置NVIDIA_DRIVER_CAPABILITIES环境变量为compute,utility,并配合--gpus参数,即可解决此问题,确保AI训练等任务顺利进行。

convnet3designer的博客 242

ByteBuffer学习

ByteBuffer字符串缓冲区学习 capacity、limit、position、mark Capacity 容量,即可以容纳的最大数据量;在缓冲区创建时被设定并且不能改变 Limit 表示缓冲区的当前终点,不能对缓冲区超过极限的位置进行读写操作。且极限是可以修改的 Position 位置,下一个要被读或写的元素的索引,每次读写缓冲区数据时都会改变改值,为下次读写作准备 Mark 标记,调用mark()来设置mark=position,再调用reset()可以让position恢复到标记的位置 ..

Yang975222579的博客 214

机械臂速成小指南(八):标准DH法实战——从连杆坐标系到运动学方程

本文详细介绍了机械臂运动学建模中的标准DH法,从连杆坐标系的建立到运动学方程的求解,提供了实用的操作步骤和代码示例。通过DH参数表和变换矩阵的构建,帮助读者快速掌握机械臂运动学建模的核心技术,并解决实际应用中的常见问题。

oo7890的博客 211

ByteBuffer 学习

ByteBuffer 实现类 堆外内存的方式 > DirectByteBuffer public static ByteBuffer allocateDirect(int capacity) { return new DirectByteBuffer(capacity); } 堆内内存的方式 > HeapByteBuffer public stati...

dyingstraw的博客 295

Open3D 基于法线的双边滤波

基于法线的双边滤波是一种用于点云平滑的技术,它结合了点与其邻域点之间的几何距离和法线方向的相似性,从而在去除噪声的同时保留几何特征。这种滤波方法广泛应用于点云处理领域,尤其是在需要保留表面细节和边缘的场景中。

纵马踏花向自由 2500

基于 YOLOv26 的高速抛物识别系统:微小目标检测

本文提出了一种基于YOLOv26的高速抛物识别系统,专注于微小目标检测。系统采用多模块协同架构,包括视频预处理、YOLOv26检测、目标跟踪和抛物行为分析等模块。关键技术包括YOLOv26s模型检测、DeepSORT目标跟踪和边缘计算部署。通过构建包含多种抛物类型的专业数据集,并应用数据增强技术提升模型性能。系统实现了车辆检测、微小抛物目标识别、抛物轨迹分析和风险等级评估等功能,可实时检测高速公路上的抛物行为并触发告警,为交通管理提供智能化解决方案。

一键难忘的博客 635

ByteBuffer深入学习

背景   最近在研究netty的源代码,发现netty的内存管理都是用jdk的ByteBuffer。为了更深入的了解bytebuffer,因此有了这篇文章   ByteBuffer的基本组成 ByteBuffer 的基本函数http://kakajw.iteye.com/blog/1797073 ByteBuffer分为两类DirectBuffer和HeapBuffer。Direc...

fannk的博客 381

使用C# HslCommunication库实现三菱PLC通信(含完整代码示例)

在工业自动化开发中,上位机与PLC的通信是关键环节。HslCommunication库是一个开源的.NET工业通信库,支持三菱、西门子、欧姆龙等多个品牌PLC的通信协议。本文将演示如何通过库实现C#程序与三菱PLC的通信,并提供完整的代码示例。

StevenChen的博客 2294

JDK 源码学习——ByteBuffer

ByteBuffer 在NIO的作用 Java SE4 开始引入Java NIO,相比较于老的IO,更加依赖底层实现。引入通道(Channels),选择器(selector),缓冲(Buffers).都更加接近操作系统执行I/O的方式.所以速度更快。 NIO 是非阻塞IO,非阻塞IO的实现是基于事件的,选择器定义了一个IO通道,程序继续运行。选择器上发生事件时,会唤醒选择器并执行相应动作。IO...

方丈的寺院 2385

优化dalsa相机检测界面

上节实现了使用qt结合dalsa相机显示检测到缺陷的画面,由于窗口过于简陋,本节将进行一个界面优化。

A1983Z的博客 991

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

NIO学习笔记(三)ByteBuffer其他API

NIO学习笔记(三)ByteBuffer其他APINIO学习笔记(三)ByteBuffer其他API1、slice()方法的使用与arrayOffset()为非0测试2、bytebuffer转换为charbuffer字符缓冲区及中文处理3、设置和获得字节顺序(大端模式,小端模式)4、创建只读缓冲区5、压缩缓冲区6、比较缓冲区的内容7、复制缓冲区8、缓冲区扩容 NIO学习笔记(三)ByteBuffer其他API 1、slice()方法的使用与arrayOffset()为非0测试 slice()方法的作用:创建

qq_43080270的博客 522

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

NIO学习 ByteBuffer详解

本文主要记录Bytebuffer 读写模式的转化get(),put(),rewind(),mark(),flip(),clean(),compact()的解释和源码分析

h1799261966的博客 326

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【JAVA】【源码学习】ByteBuffer

最近看Netty相关的源码,Netty自己封装了一套完整、复杂的buffer功能,但是用到java nio,则必须转换为ByteBuffer,于是先学习ByteBuffer,才能更深入的理解ByteBuf。写的有点简略,主要是浏览了一遍之后,发现除了几个核心类,其他的大部分都是功能包装没必要花精力写。

凉水的博客 339

ByteBuffer学习笔记

该类继承Buffer类,Buffer类的继承关系图如下: Buffer类继承关系图ByteBuffer类 从上面的图可以看出,该类有三个子类,MappedByteBuffer、HeapByteBuffer、DirectByteBuffer,其中HeapByteBuffer和DirectByteBuffer分别用于堆上内存和非堆上内存。 DirectByteBuffer不是分配在堆上的,它不被...

weixin_39935887的博客 660

java byteBuffer 的学习

1.对java.nio包的理解java.nio.*包中引入了新的JavaI/O类库 为了提高IO读写速度。用缓存和通道更加接近操作系统的IO方式我们要读取到数据,并没有直接和通道交互;只是和缓冲器交互,并把缓冲器派送到通道。通道要么从缓冲器获得数据,要么向缓冲器发送数据!   用户数据读写ByteBufferFileChannel 2.缓冲区 特定基本类型元素的线性有限序列

因为了解所以无知 5736

学习socket nio 之ByteBuffer

1:什么是ByteBuffer? ByteBuffer就是字节缓冲区.那什么是字节缓冲区?举个例子:就好比CPU和硬盘之间的内存。明白了吧。 2:ByteBuffer是用来干嘛呢? 顾名思义,它是用来存放字节的。很常用的地方就是程序向网络中传送数据的时候。 3:怎么使用ByteBuffer? 要使用ByteBuffer,理解其中3个指针式很重要的。position、limit和capac

貌似君子的专栏 7746

java bytebuffer读取_Java NIO学习笔记之二-图解ByteBuffer

ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰。《程序员的思维修炼》一本书讲过,主动学习,要比单纯看资料效果来的好,所以干脆写个详细点的文章来记录一下。概述ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式:HeapByteBuffer是基于Java堆的实现,而DirectByteBuffer则使用了unsafe的API进行了堆外的实现。这里...

weixin_28689969的博客 1616

ByteBuffer的学习笔记

ByteBuffer查看它的类信息,大概是如下 其中个人理解就是一个字节信息的容器。 实例化后的模样 这里的pos、lim和cap就是下图中的 put 尝试put进去一个字节数组和一个int整数 结果变成了这样,那大概可以理解出来put就是往里边写数据,然后每次写进去一个字节,pos就会增加1,这里在放入一个int之后,我还在想为啥直接到第八个了,后来突然想到int型数据就是4字节,那么4+4自然就是8了。 接下来是一个flip操作 看它的函数是这样的 :简简单单,就是一个复位重置操作。 g

qq_35885429的博客 300

NIO学习之ByteBuffer理解篇

NIO学习之ByteBuffer理解篇

在远处,不远处 502

ByteBuffer与FileChannel学习笔记

ByteBuffer与FileChannel学习笔记 ps:今天看了很多博客学习了ByteBuffer和FileChannel,融合了其他大佬们的精华,整理成笔记。 首先我们来说说这两个类是什么: ByteBuffer类是在Java NIO中常常使用的一个缓冲区类,使用它可以进行高效的IO操作。 FileChannel就是连接到文件的管道。使用FileChannel,你可以读取文件数据,以...

weixin_42558056的博客 850
上一篇: org.apache.thrift.TApplicationException: Invalid method name问题解决
下一篇: http chunked传输
coding_1994
博客等级 码龄9年 636粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值