一文解读java.nio.ByteBuffer

 更新时间:2023年08月21日 10:18:50   作者:bjxiaxueliang  
这篇文章主要介绍了java.nio.ByteBuffer的用法解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

java.nio.ByteBuffer 是一个可以进行 缓冲区分配 读取 写入 的缓冲区,其 持有一个字节数组

并通过4个属性:

  • capacity 
  • limit 
  • position 
  • mark

来管理缓冲区,进行字节级别读取和数据写入。

基于此,ByteBuffer常被用来处理网络协议和I/O操作。

一、使用举例

以下为ByteBuffer的使用举例:

  • 可以使用put()方法将数据写入缓冲区;
  • 可以使用flip()方法切换缓冲区为读取模式;
  • 可以使用rewind()方法倒回缓冲区的初始位置;
  • 可以使用get()方法读取缓冲区中的数据;
  • 可以使用clear()方法清空缓冲区,以便再次写入数据。
import java.nio.ByteBuffer;
public class JavaTest {
    public static void main(String[] args)
    {
        System.out.println("~~~~~~~~ put(byte b) ~~~~~~~~");
        // 分配一个5字节的buffer
        ByteBuffer byteBuffer = ByteBuffer.allocate(5);
        // 向buffer中添加两个字节的数据,空余3个字节数据
        byteBuffer.put((byte)10);
        byteBuffer.put((byte)20);
        // 输出整个字节数组
        printByteBuffer(byteBuffer);
        System.out.println("~~~~~~~~ flip() ~~~~~~~~");
        // 转为读模式
        byteBuffer.flip();
        // 输出整个字节数组
        printByteBuffer(byteBuffer);
        System.out.println("~~~~~~~~ get() ~~~~~~~~");
        // 读取当前 position 
        System.out.println(byteBuffer.get());
        // 输出整个字节数组
        printByteBuffer(byteBuffer);
        System.out.println("~~~~~~~~ rewind() ~~~~~~~~");
        // 倒回缓冲区的初始位置
        byteBuffer.rewind();
        printByteBuffer(byteBuffer);
        System.out.println("~~~~~~~~ get(byte[] dst, int offset, int length) ~~~~~~~~");
        // 将buffer中数据写入到dstBytes中
        byte[] dstBytes = new byte[2];
        byteBuffer.get(dstBytes, 0, dstBytes.length);
        printByteBuffer(byteBuffer);
    }
    public static void printByteBuffer(ByteBuffer byteBuffer) {
        byte[] bytes = byteBuffer.array();
        int position = byteBuffer.position();
        int limit = byteBuffer.limit();
        int remining = byteBuffer.remaining();
        System.out.println("byteBuffer: "
                + Arrays.toString(bytes)
                + "\nPosition: " + position
                + " Limit: " + limit
                + " Remining: " + remining);
    }
}

控制台输出如下:

~~~~~~~~ put(byte b) ~~~~~~~~
byteBuffer: [10, 20, 0, 0, 0]
Position: 2 Limit: 5 Remining: 3
~~~~~~~~ flip() ~~~~~~~~
byteBuffer: [10, 20, 0, 0, 0]
Position: 0 Limit: 2 Remining: 2
~~~~~~~~ get() ~~~~~~~~
10
byteBuffer: [10, 20, 0, 0, 0]
Position: 1 Limit: 2 Remining: 1
~~~~~~~~ rewind() ~~~~~~~~
byteBuffer: [10, 20, 0, 0, 0]
Position: 0 Limit: 2 Remining: 2
~~~~~~~~ get(byte[] dst, int offset, int length) ~~~~~~~~
byteBuffer: [10, 20, 0, 0, 0]
Position: 2 Limit: 2 Remining: 0

二、原理简析

前边说过 ByteBuffer持有一个字节数组

并通过4个属性:

  • capacity
  • limit
  • position
  • mark来管理缓冲区

这4个属性遵循

mark <= position <= limit <= capacity ​​​​​​​

下表格是对着4个属性的解释:

属性描述
Capacity容量,即可以容纳的最大数据量
Limit缓冲区的当前终点,不能对缓冲区超过极限的位置进行读写操作
Position下一个要被读或写的元素的索引
Mark标记。可调用mark()设置标记(mark=position),然后调用reset()让position恢复到标记的位置

初始化,各控制属性状态:

例如调用

ByteBuffer byteBuffer = ByteBuffer.allocate(5); 

进行ByteBuffer存储空间分配,

各属性见下图所示:

写入数据后,各控制控制属性状态:

例如调用

byteBuffer.put((byte)'a') 

写入数据后,

各属性见下图所示:

读取数据后,各控制控制属性状态:

例如调用

byteBuffer.get() 

读取4个字节后,

各属性见下图所示:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java中的Struts2拦截器详解

    java中的Struts2拦截器详解

    本篇文章主要介绍了java中的Struts2拦截器浅解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • java读取csv文件示例分享(java解析csv文件)

    java读取csv文件示例分享(java解析csv文件)

    这篇文章主要介绍了java读取csv文件示例,这个java解析csv文件的例子很简单,下面直接上代码,大家参考使用吧
    2014-03-03
  • executor包执行器功能

    executor包执行器功能

    这篇文章主要介绍了executor包执行器功能,executor包中的各个子包提供的功能,最终这些功能都由Executor接口及其实现类共同对外提供服务。下文介绍该执行功能,具有一定的参考价值,需要的朋友可以考一下
    2022-02-02
  • java网上图书商城(1)User模块

    java网上图书商城(1)User模块

    这篇文章主要介绍了java网上图书商城,User模块,实现用户注册功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Spring事务失效的十大陷阱与终极解决方案

    Spring事务失效的十大陷阱与终极解决方案

    本文将全面剖析Spring事务失效的各种场景,提供完整的代码示例和解决方案,帮你彻底掌握事务管理的精髓,感兴趣的小伙伴跟着小编一起来看看吧
    2025-10-10
  • nacos中的配置使用@Value注解获取不到值的原因及解决方案

    nacos中的配置使用@Value注解获取不到值的原因及解决方案

    这篇文章主要介绍了nacos中的配置使用@Value注解获取不到值的原因分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 一文带你学会Java网络编程

    一文带你学会Java网络编程

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。这篇文章将带大家深入了解一下Java的网络编程,需要的可以了解一下
    2022-08-08
  • 详解Nacos配置中心的实现

    详解Nacos配置中心的实现

    Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案。而 Nacos 作为 Spring Cloud Alibaba 的核心组件之一,提供了两个非常重要的功能:注册中心和配置中心,我们今天来了解和实现一下二者
    2022-08-08
  • Spring常用数据源的xml配置详解

    Spring常用数据源的xml配置详解

    这篇文章主要介绍了Spring常用数据源的xml配置详解,数据源是连接到数据库的一类路径,它包含了访问数据库的信息(地址、用户名、密码),数据源就像是排水管道,需要的朋友可以参考下
    2023-07-07
  • 基于java+springboot+mybatis+laiyu实现学科竞赛管理系统

    基于java+springboot+mybatis+laiyu实现学科竞赛管理系统

    这篇文章主要介绍了基于java+springboot+mybatis+laiyu实现的学科竞赛管理系统,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09

最新评论