zoukankan      html  css  js  c++  java
  • Unpooled 工具类的使用

    Netty 提供一个专门用来操作缓冲区(即Netty的数据容器)的工具类:io.netty.buffer.Unpooled

    之前简单用过,如下:

        /**
         * 通道就绪事件
         *
         * @param ctx
         * @throws Exception
         */
        @Override
        public void channelActive(ChannelHandlerContext ctx) throws Exception {
            log.info("ClientHandler ctx: " + ctx);
            ctx.writeAndFlush(Unpooled.copiedBuffer("hello, 服务器!", CharsetUtil.UTF_8));
        }

    查看AbstractByteBuf 有三个属性,

    readerIndex 下次读取的下标

    writerIndex 下次写入时的下标

    maxCapacity 容量

    通过 readerindex 和 writerIndex 和 capacity, 将buffer分成三个区域:

    0---readerindex 已经读取的区域;readerindex---writerIndex , 可读的区域;writerIndex -- capacity, 可写的区域。

    1. 测试一

    package netty;
    
    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    
    public class NettyByteBuf01 {
    
        public static void main(String[] args) {
            //创建一个ByteBuf
            //说明
            //1. 创建对象,该对象包含一个数组arr,是一个byte[10]
            //2. 在netty 的buffer中,不需要使用flip 进行反转
            //   底层维护了 readerindex 和 writerIndex
            //3. 通过 readerindex 和  writerIndex 和  capacity, 将buffer分成三个区域
            // 0---readerindex 已经读取的区域
            // readerindex---writerIndex , 可读的区域
            // writerIndex -- capacity, 可写的区域
            ByteBuf buffer = Unpooled.buffer(10);
            for (int i = 0; i < 10; i++) {
                buffer.writeByte(i);
            }
    
            System.out.println("capacity=" + buffer.capacity());//10
            //输出
    //        for(int i = 0; i<buffer.capacity(); i++) {
    //            System.out.println(buffer.getByte(i));
    //        }
            for (int i = 0; i < buffer.capacity(); i++) {
                System.out.println(buffer.readByte());
            }
            System.out.println("执行完毕");
        }
    }

    结果:

    capacity=10
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    执行完毕

    2. 测试类2:

    package netty;
    
    import io.netty.buffer.ByteBuf;
    import io.netty.buffer.Unpooled;
    
    import java.nio.charset.Charset;
    
    public class NettyByteBuf02 {
    
        public static void main(String[] args) {
            //创建ByteBuf
            ByteBuf byteBuf = Unpooled.copiedBuffer("hello,world!", Charset.forName("utf-8"));
            //使用相关的方法
            if (byteBuf.hasArray()) { // true
                byte[] content = byteBuf.array();
                //将 content 转成字符串
                System.out.println(new String(content, Charset.forName("utf-8")));
                System.out.println("byteBuf=" + byteBuf);
    
                System.out.println(byteBuf.arrayOffset()); // 0
                System.out.println(byteBuf.readerIndex()); // 0
                System.out.println(byteBuf.writerIndex()); // 12
                System.out.println(byteBuf.capacity()); // 36
    
                //System.out.println(byteBuf.readByte()); //
                System.out.println(byteBuf.getByte(0)); // 104
    
                int len = byteBuf.readableBytes(); //可读的字节数  12
                System.out.println("len=" + len);
    
                //使用for取出各个字节
                for (int i = 0; i < len; i++) {
                    System.out.println((char) byteBuf.getByte(i)); // 强行转为字符串,否则会直接打印ASCII码
                }
    
                //按照某个范围读取
                System.out.println(byteBuf.getCharSequence(0, 4, Charset.forName("utf-8")));
                System.out.println(byteBuf.getCharSequence(4, 6, Charset.forName("utf-8")));
            }
        }
    }

     结果:

    hello,world!                        
    byteBuf=UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 0, widx: 12, cap: 36)
    0
    0
    12
    36
    104
    len=12
    h
    e
    l
    l
    o
    ,
    w
    o
    r
    l
    d
    !
    hell
    o,worl
    【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】
  • 相关阅读:
    编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译
    编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义
    编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
    LeetCode 1347. Minimum Number of Steps to Make Two Strings Anagram
    LeetCode 1348. Tweet Counts Per Frequency
    1349. Maximum Students Taking Exam(DP,状态压缩)
    LeetCode 1345. Jump Game IV(BFS)
    LeetCode 212. Word Search II
    LeetCode 188. Best Time to Buy and Sell Stock IV (动态规划)
    LeetCode 187. Repeated DNA Sequences(位运算,hash)
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/14598811.html
Copyright © 2011-2022 走看看