您当前的位置: 首页 > 

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Netty——ByteBuffer(ByteBuffer的方法说明演示示例)

小志的博客 发布时间:2022-07-24 18:28:34 ,浏览量:0

目录
    • 一、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 方法示例

一、ByteBuffer的常见方法 1.1、分配空间方法 1.1.1、分配空间方法的概述
  • 可以使用 allocate 方法为 ByteBuffer 分配空间,其它 buffer 类也有该方法。
1.1.2、分配空间方法示例
  • 示例代码

    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 影响,分配的效率低。

1.2、向 buffer 写入数据方法 1.2.1、向 buffer 写入数据方法的概述
  • 有两种方式可以向buffer 写入数据
  • 第一种方式:调用 channel 的 read 方法
  • 第一种方式:调用 buffer 自己的 put 方法
1.2.2、向 buffer 写入数据方法示例
  • 示例代码

    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());
        }
    }
    
  • 输出结果 在这里插入图片描述

1.3、从 buffer 读取数据方法 1.3.1、从 buffer 读取数据方法的概述
  • 有两种方式可以从 buffer 读取数据
  • 第一种方式:调用 channel 的 write 方法
  • 第一种方式:调用 buffer 自己的 get 方法
1.3.2、从 buffer 读取数据方法示例
  • 示例代码

    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);
        }
    }
    
  • 输出结果 在这里插入图片描述

1.3.3、buffer 的 get 方法注意事项
  • get 方法会让 position 读指针向后走,如果想重复读取数据: (1)、可以调用 rewind 方法将 position 重新置为 0。 (2)、或者调用 get(int i) 方法获取索引 i 的内容,它不会移动读指针。
1.4、 rewind 方法 1.4.1、rewind 方法的概述
  • rewind 方法将 position 重新置为 0。
1.4.2、rewind 方法示例
  • 工具类,输出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             
关注
打赏
1661269038
查看更多评论
0.0559s