java.nio.ByteBuffer 学习笔记

目录

[java 重复使用bytebuffer例子:](#java 重复使用bytebuffer例子:)

java验证flip函数:

flip讲解

以下内容转自:

java.nio.ByteBuffer


java 重复使用bytebuffer例子:

java 复制代码
import java.nio.ByteBuffer;

public class ByteBufferExample {
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocateDirect(1024); // 创建直接字节缓冲区

        for (int i = 0; i < 10; i++) {
            String data = "Data " + i;
            buffer.put(data.getBytes()); // 写入数据
            buffer.flip(); // 转换为读模式

            nativeMethod(buffer); // 调用本地方法

            buffer.clear(); // 清空缓冲区,准备下一轮写入
        }
    }

    public static native void nativeMethod(ByteBuffer buffer); // 本地方法声明
}

java验证flip函数:

java 复制代码
import java.nio.ByteBuffer;

public class Main {
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);

        System.out.println("Initial capacity: " + buffer.capacity()); // Prints: 10
        System.out.println("Initial limit: " + buffer.limit()); // Prints: 10
        System.out.println("Initial position: " + buffer.position()); // Prints: 0
        System.out.println("Initial remaining: " + buffer.remaining()); // Prints: 10

        buffer.put((byte) 123); // Write a byte into the buffer

        System.out.println("After putting a byte, remaining: " + buffer.remaining()); // Prints: 9

        buffer.flip(); // Switch to read mode

        System.out.println("After flipping, remaining: " + buffer.remaining()); // Prints: 1
    }
}

flip讲解

以下内容转自:

https://www.cnblogs.com/chdf/p/11466522.html

java.nio.ByteBuffer

  1. ByteBuffer中的参数position、limit、capacity、mark含义:

position:表示当前指针的位置(下一个要操作的数据元素的位置)

limit:表示当前数组最大的使用量,即有效位置的EOF位置(缓冲区数组中不可操作的下一个元素的位置,limit<=capacity)

capacity:表示缓冲区最大容量(缓冲区数据的总长度)

mark:用于记录当前position的前一个位置或者默认是-1

  1. ByteBuffer中常用方法含义:

reset():把position设置为mark的值,相当于之前做过一个标记,现在回退到之前标记的地方。

clear():将参数设置为position=0,limit=capacity,mark=-1,类似于初始化,但并不影响底层byte数组的内容(注意:clear只是把指针移到位置0,并没有真正清空数据)。

flip():将参数设置为limit=position,position=0,mark=-1,翻转,即将未翻转之前0到position之间的数据放置到翻转之后的position(即0)到limit之间的这块区域,翻转将缓冲区的状态由存数据变为准备取数据(注意:将当前位置设置为EOF,指针位置指向0)。

rewind():将参数设置为position=0,mark=-1,limit的值不变(注意:指针指向0)。

remaining():return limit - position,即返回limit和position之间的相对位置差。

hasRemaining():return position < limit,即返回是否还有未读内容。

compact():将position与limit之间的内容移到0与(limit - position)之间的区域,position的值变为limit - position,limit的值变为capacity;如果先将position的设置到limit,再执行compact操作,就相当于clear操作(注意:compact表示压缩数据,例如当前EOF是6,当前指针指向2即下标0、1位置的数据已经写出,此时执行compact方法就是将下标2、3、4、5的数据移动到下标0、1、2、3的位置,指针指向下标4的位置,然后从4的位置继续写入数据。写完后,把指针移动到0,再写出,然后再执行compact操作,如此反复......)。

示例:初始化一个ByteBuffer,缓冲区最大容量为10,开始指针指向下标0即position=0。

   然后写入6字节数据,写入完成后下标0、1、2、3、4、5位置有实际写入的数据,下标6、7、8、9位置为默认值0。

   此时,指针指向6,即position=6,limit(6)方法会将当前位置设为EOF位置。

   最后,读取数据时读取到EOF位置就会结束。

相关推荐
剑挑星河月几秒前
234. 回文链表
java·数据结构·算法·leetcode·链表
say_fall6 分钟前
【Git 精品详解】企业规范:企业级开发模型、Git Flow、发版流程规范、Code Owner 制度、事故应急回滚
大数据·linux·服务器·git·学习·elasticsearch
plainGeekDev9 分钟前
Gradle 写法 → Kotlin DSL
android·java·kotlin
kgduu11 分钟前
react-redux学习笔记
笔记·学习·react.js
RainCityLucky22 分钟前
Java Swing 自定义组件库分享(十三)
java·笔记·后端
诗句藏于尽头29 分钟前
Ai-3D音乐播放器-Mineradio -VibeCoding大赏-新增歌词字体自定义上传功能(个人学习)
学习
TE-茶叶蛋1 小时前
Node.js-Phase 1 学习总结:CLI 文件管理系统
学习·node.js
无限的鲜花9 小时前
反射(原创推荐)
java·开发语言
IT二叔9 小时前
Java项目部署-03-teamcity-cicd-docker镜像流水线方式部署
java·ci/cd·持续部署
一路向北he9 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端