博客
关于我
Nio ByteBuffer组件读写指针切换原理与常用方法
阅读量:794 次
发布时间:2023-02-16

本文共 1762 字,大约阅读时间需要 5 分钟。

ByteBuffer在Nio中应用广泛,因此了解它的使用方法和原理至关重要。以下是ByteBuffer的基本使用步骤和背后的逻辑。

ByteBuffer的使用步骤

  • 写入数据

    使用channel.read(buffer)等方法将数据写入ByteBuffer中。

  • 切换到读模式

    调用buffer.flip()将ByteBuffer切换为读模式。

  • 读取数据

    使用buffer.get()等方法从ByteBuffer中读取数据。

  • 切换到写模式

    调用buffer.clear()buffer.compact()切换回写模式。

  • 重复上述步骤

    循环进行写入、读取和切换操作。

  • 为什么需要切换读写模式?

    ByteBuffer的内部结构包括三个关键属性:

    • Capacity(容量):Buffer的最大数据容量。
    • Position(位置):当前读写指针。
    • Limit(限制):读写的最大位置。

    在创建Buffer时,Capacity固定为容量值,Limit初始化为Capacity,而Position则从0开始。当处于写模式时,Position表示下一个写入的位置,Limit等于Capacity。当写入数据后,调用flip()切换为读模式,此时Limit变为当前Position的值,而Position则重置为0。

    例如,假设Buffer容量为4字节:

  • 写模式Position=0,Limit=4。
  • 写入4字节后Position=4,Limit=4。
  • 调用flip()切换为读模式Position=0,Limit=4。
  • 读取4字节后Position=4,Limit=4。
  • 调用clear()切换回写模式Position=0,Limit=4(数据未丢失)。
  • 或者调用compact()切换回写模式:未读取的数据会被移动到前面,Position=0,Limit=剩余未读数据的位置。
  • 常用方法

    创建Buffer

    • ByteBuffer.allocate(int number):创建容量为number的Buffer。
    • ByteBuffer.allocateDirect(int number):创建直接内存Buffer,性能更高但需要手动释放。

    切换模式

    • buffer.flip():切换为读模式。
    • buffer.clear():切换回写模式。
    • buffer.compact():移动未读数据到前面并切换回写模式。

    读取数据

    • buffer.get():读取单个字节。
    • buffer.get(Byte[] byte):读取多个字节。
    • buffer.rewind():将Position重置为0。
    • buffer.make() + buffer.reset():重新读取数据。

    写入数据

    • channel.read(buffer):从通道读取数据写入Buffer。

    字符串与ByteBuffer互转

    以下是将字符串与ByteBuffer互相转换的示例:

    package com.hs.netty;import java.nio.ByteBuffer;public class ByteBufferDemo {    public static void main(String[] args) {        // 1. 创建一个容量为10的ByteBuffer        ByteBuffer buffer = ByteBuffer.allocate(10);                // 2. 写入字符串        String data = "Hello, World!";        buffer.put(data.getBytes());                // 3. 切换到读模式        buffer.flip();                // 4. 读取字节        byte[] bytes = new byte[10];        buffer.get(bytes);                // 5. 转换为字符串        System.out.println(new String(bytes));    }}

    希望以上内容对您有所帮助!

    转载地址:http://sdjfk.baihongyu.com/

    你可能感兴趣的文章
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_02---大数据之Nifi工作笔记0034
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002---大数据之Nifi工作笔记0069
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim教程【十二】
    查看>>
    Nim游戏
    查看>>
    NIO ByteBuffer实现原理
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>
    NIO_通道之间传输数据
    查看>>