千家信息网

Netty的NIO Buffer案例分析

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"Netty的NIO Buffer案例分析",在日常操作中,相信很多人在Netty的NIO Buffer案例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
千家信息网最后更新 2026年10月31日Netty的NIO Buffer案例分析

这篇文章主要介绍"Netty的NIO Buffer案例分析",在日常操作中,相信很多人在Netty的NIO Buffer案例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Netty的NIO Buffer案例分析"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1、Buffer概念

1、缓冲区获取

    Buffer缓冲区是就是一个数组,有着不同的数据类型:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer,然后这些数据类型都可以通过 allocate() 获取缓冲区。

static XxxBuffer allocate(int capacity) : 创建一个容量为 capacity 的 XxxBuffer 对象,如下:

//1. 分配一个指定大小的Byte类型的缓冲区ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

2、缓冲区存取数据的两个核心方法

put() : 存入数据到缓冲区中

put(byte b)将给定单个字节写入缓冲区的当前位置

put(byte[] src)

将 src 中的字节写入缓冲区的当前位置

put(int index, byte b)

将指定字节写入缓冲区的索引位置(不会移动 position)


get() : 获取缓冲区中的数据

get()

读取单个字节

get(byte[] dst)

批量读取多个字节到 dst 中

get(int index)

读取指定索引位置的字节(不会移动 position)

byteBuffer.put("Mujiutian");
byteBuffer.get();

3、缓冲区中的四个核心属性

0 <= mark <= position <= limit <= capacity

capacity : 容量,表示缓冲区中最大存储数据的容量。一旦声明不能改变。

byteBuffer.capacity()

limit : 界限,表示缓冲区中可以操作数据的大小。(limit 后数据不能进行读写)

byteBuffer.limit()

position : 位置,表示缓冲区中正在操作数据的位置。

byteBuffer.position()

mark : 标记,表示记录当前 position 的位置。可以通过 reset() 恢复到 mark 的位置

byteBuffer.mark()

4、Buffer常用的方法

5、直接缓冲区与非直接缓冲区

非直接缓冲区:通过 allocate() 方法分配缓冲区,将缓冲区建立在 JVM 的内存中

直接缓冲区:通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中。可以提高效率

2、代码讲解

1、使用缓冲区的各种方法

@Testpublic void test1(){   String str = "MuJiuTian";      //1. 分配一个指定大小的Byte类型的缓冲区   ByteBuffer buf = ByteBuffer.allocate(1024);      System.out.println("-----------------allocate()----------------");   //此时缓冲区为读,下标位置   System.out.println(buf.position());   //此时缓冲区的界线,也就是临界点,1024   System.out.println(buf.limit());   //缓冲区的容量   System.out.println(buf.capacity());      //2. 利用 put() 存入数据到缓冲区中   buf.put(str.getBytes());      System.out.println("-----------------put()----------------");   //此时缓冲区为读,下标位置已经读到第五个了   System.out.println(buf.position());   System.out.println(buf.limit());   System.out.println(buf.capacity());      //3. 切换读取数据模式,切换为写的模式,也就是把刚刚读取的内容重新从下标0开始读   buf.flip();      System.out.println("-----------------flip()----------------");   System.out.println(buf.position());   System.out.println(buf.limit());   System.out.println(buf.capacity());      //4. 利用 get() 读取缓冲区中的数据   byte[] dst = new byte[buf.limit()];   buf.get(dst);   System.out.println(new String(dst, 0, dst.length));      System.out.println("-----------------get()----------------");   System.out.println(buf.position());   System.out.println(buf.limit());   System.out.println(buf.capacity());      //5. rewind() : 可重复读   buf.rewind();      System.out.println("-----------------rewind()----------------");   System.out.println(buf.position());   System.out.println(buf.limit());   System.out.println(buf.capacity());      //6. clear() : 清空缓冲区. 但是缓冲区中的数据依然存在,但是处于"被遗忘"状态   buf.clear();      System.out.println("-----------------clear()----------------");   System.out.println(buf.position());   System.out.println(buf.limit());   System.out.println(buf.capacity());      System.out.println((char)buf.get());}

结果:

看刚刚的流程图:

2、使用简单方法掌握buffer的基本方法

@Testpublic void test2(){   String str = "Mujiutian";   //创建Byte类型缓冲区   ByteBuffer byteBuffer = ByteBuffer.allocate(1024);   //此时为读模式,读取str内容   byteBuffer.put(str.getBytes());   //切换为写的模式,处理刚刚读取的内容   byteBuffer.flip();   //此时limit为9,因为读取了Mujiutian 9个字节   byte[] dst = new byte[byteBuffer.limit()];   //读取下标0到2的字节   byteBuffer.get(dst, 0, 2);   System.out.println(new String(dst, 0, 2));   System.out.println(byteBuffer.position());      //mark() : 标记   byteBuffer.mark();   byteBuffer.get(dst, 2, 2);   System.out.println(new String(dst, 2, 2));   System.out.println(byteBuffer.position());      //reset() : 使用该方法,位置恢复到 mark 的位置   byteBuffer.reset();   System.out.println(byteBuffer.position());      //判断缓冲区中是否还有剩余数据   if(byteBuffer.hasRemaining()){      //获取缓冲区中可以操作的数量      System.out.println(byteBuffer.remaining());   }}

结果为:

3、测试是否为缓冲区

@Testpublic void test3(){   //分配直接缓冲区   ByteBuffer buf = ByteBuffer.allocateDirect(1024);   System.out.println(buf.isDirect());}

结果:true

到此,关于"Netty的NIO Buffer案例分析"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

缓冲区 缓冲 数据 位置 方法 字节 类型 分配 案例 案例分析 分析 下标 容量 模式 学习 内容 大小 结果 切换 也就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 西安纸贵互联网科技有限公司 科技类互联网 华宇互联网科技 智网互联网科技 互联网科技公司官网 四川狮子座互联网科技 深圳卡尔迅互联网科技有限公司怎么样 玖二柒互联网科技公司待遇 宁夏众和广鑫互联网科技有限公司 武汉健翔互联网络科技有限公司 青岛科技大学互联网大赛研究生 中国互联网十大科技股排名 互联网公司黑科技创始人 南通创西澳互联网科技有限公司 江苏互联网智能科技软件 昆明中奇联合互联网科技 陕西九四连强互联网科技有限公司 银川新华互联网科技学校是国营吗 中国科技和美国互联网 利用互联网等科技手段 博彦科技互联网金融 广州淘业互联网络科技 科技金融是不是互联网金融 科技创新与互联网经济 万易互联网科技 互联网科技的未来发展 金融科技和互联网金融 成都玖崟互联网科技有限公司乐商圈怎么样 科技互联网的核心竞争力 西安有哪些互联网高科技企业
0