目录
一、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
关注打赏
热门博文
- Netty——网络编程 NIO(Selector处理accept事件)代码示例
- CompletableFuture异步编排(多任务组合)
- CompletableFuture异步编排(线程串行化代码示例)
- CompletableFuture异步编排(handle最终处理)
- CompletableFuture异步编排(计算完成回调代码示例)
- hutool工具导出excel代码示例
- java 获取音频、视频文件时长代码示例
- PostMan发送请求参数带有路径特殊字符会返回400错误(与URL字符及URL编码值有关)
- Rabbitmq与Erlang安装包下载图解
- idea2021.1版本SpringBoot项目日志的说明及使用