目录
一、ByteBuffer的常见方法
1.1、分配空间方法
1.1.1、分配空间方法的概述
- 一、ByteBuffer的常见方法
- 1.1、分配空间方法
- 1.1.1、分配空间方法的概述
- 1.1.2、分配空间方法示例
- 1.2、向 buffer 写入数据方法
- 1.2.1、向 buffer 写入数据方法的概述
- 1.2.2、向 buffer 写入数据方法示例
- 1.3、从 buffer 读取数据方法
- 1.3.1、从 buffer 读取数据方法的概述
- 1.3.2、从 buffer 读取数据方法示例
- 1.3.3、buffer 的 get 方法注意事项
- 1.4、 rewind 方法
- 1.4.1、rewind 方法的概述
- 1.4.2、rewind 方法示例
- 1.5、get(int i) 方法
- 1.5.1、get(int i) 方法的概述
- 1.5.2、get(int i) 方法示例
- 1.6、mark 和 reset 方法
- 1.6.1、mark 和 reset 方法 方法的概述
- 1.6.2、mark 和 reset 方法示例
- 可以使用 allocate 方法为 ByteBuffer 分配空间,其它 buffer 类也有该方法。
-
示例代码
package com.example.nettytest.nio.day1; import lombok.extern.slf4j.Slf4j; import java.nio.ByteBuffer; /** * @description: * @author: xz * @create: 2022-07-24 18:05 */ @Slf4j public class TestByteBufferAllocate { public static void main(String[] args) { log.info("allocate方法====="+ByteBuffer.allocate(16).getClass()); log.info("allocateDirect方法====="+ByteBuffer.allocateDirect(16).getClass()); /** * class java.nio.HeapByteBuffer * java 堆内存,读写效率较低,受到 GC 的影响 * class java.nio.DirectByteBuffer * 直接内存,读写效率高(少一次拷贝),不会受 GC 影响,分配的效率低 * */ } }
-
输出结果
-
java.nio.HeapByteBuffer 和java.nio.DirectByteBuffer区别 (1)、HeapByteBuffer:java 堆内存,读写效率较低,受到 GC 的影响。 (2)、DirectByteBuffer:直接内存,读写效率高(少一次拷贝),不会受 GC 影响,分配的效率低。
- 有两种方式可以向buffer 写入数据
- 第一种方式:调用 channel 的 read 方法
- 第一种方式:调用 buffer 自己的 put 方法
-
示例代码
package com.example.nettytest.nio.day1; import lombok.extern.slf4j.Slf4j; import java.nio.ByteBuffer; import static com.example.nettytest.nio.day1.ByteBufferUtil.debugAll; /** * @description: * @author: xz * @create: 2022-07-24 18:05 */ @Slf4j public class TestByteBufferAllocate { public static void main(String[] args) { ByteBuffer buffer = ByteBuffer.allocate(10); /** * 写入十六进制的一个字节 * */ buffer.put((byte) 0x61); /** * 切换到读模式,并读取一个字节(该十六进制字节读取后会转换成十进制并输出) * */ buffer.flip(); System.out.println(buffer.get()); } }
-
输出结果
- 有两种方式可以从 buffer 读取数据
- 第一种方式:调用 channel 的 write 方法
- 第一种方式:调用 buffer 自己的 get 方法
-
示例代码
package com.example.nettytest.nio.day1; import lombok.extern.slf4j.Slf4j; import java.nio.ByteBuffer; import static com.example.nettytest.nio.day1.ByteBufferUtil.debugAll; /** * @description: * @author: xz * @create: 2022-07-24 18:05 */ @Slf4j public class TestByteBufferAllocate { public static void main(String[] args) { ByteBuffer buffer = ByteBuffer.allocate(10); /** * 写入十六进制的一个字节 * */ buffer.put((byte) 0x61); /** * 切换到读模式 * */ buffer.flip(); /** * 读取一个字节(该十六进制字节读取后会转换成十进制并输出) * */ byte b = buffer.get(); log.info("从 buffer 读取到的数据为:"+b); } }
-
输出结果
- get 方法会让 position 读指针向后走,如果想重复读取数据: (1)、可以调用 rewind 方法将 position 重新置为 0。 (2)、或者调用 get(int i) 方法获取索引 i 的内容,它不会移动读指针。
- rewind 方法将 position 重新置为 0。
-
工具类,输出ByteBuffer内部结构使用
package com.example.nettytest.nio.day1; import io.netty.util.internal.StringUtil; import java.nio.ByteBuffer; import static io.netty.util.internal.MathUtil.isOutOfBounds; import static io.netty.util.internal.StringUtil.NEWLINE; public class ByteBufferUtil { private static final char[] BYTE2CHAR = new char[256]; private static final char[] HEXDUMP_TABLE = new char[256 * 4]; private static final String[] HEXPADDING = new String[16]; private static final String[] HEXDUMP_ROWPREFIXES = new String[65536 >>> 4]; private static final String[] BYTE2HEX = new String[256]; private static final String[] BYTEPADDING = new String[16]; static { final char[] DIGITS = "0123456789abcdef".toCharArray(); for (int i = 0; i 4 & 0x0F]; HEXDUMP_TABLE[(i
关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?