美文网首页
NIO-buffer各个属性介绍

NIO-buffer各个属性介绍

作者: SteveGuRen | 来源:发表于2018-11-03 08:00 被阅读12次
    • limit(限制),第一个不应该读取或写入元素的index
    • capacity,代表着缓冲区的大小
    • position,是下一个读取或者写入操作的index
    • remaining,剩余空间大小,remaining = limit - position
    • mark,记录当前的position位置,mark如果在大于position或者limit时,会被丢弃
    • reset方法,重置当前position为上次的position位置

    测试limit的作用

        /**
         * put测试以及limit、capacity测试
         */
        public static void putTest() {
            char[] charArray = new char[] {'a', 'b', 'c', 'd'};
            CharBuffer buffer = CharBuffer.wrap(charArray);
            //此时capacity和limit都为4
            System.out.println("CharBuffer.capacity:" + buffer.capacity());
            System.out.println("CharBuffer.limit:" + buffer.limit());
            //设置limit为3
            buffer.limit(3);
            //通过put设置数据
            buffer.put('a');
            buffer.put('b');
            buffer.put('c');
            //下面这一行报错
            buffer.put('d');
            buffer.put('e');
            
        }
    

    测试position的作用

        public static void positionTest() {
            char[] charArray = new char[] {'a', 'b', 'c', 'd'};
            CharBuffer buffer = CharBuffer.wrap(charArray);
            //此时capacity和limit都为4
            System.out.println("CharBuffer.capacity:" + buffer.capacity());
            System.out.println("CharBuffer.position:" + buffer.position());
            //设置当前存储数据的position
            buffer.position(2);
            System.out.println("CharBuffer.capacity:" + buffer.capacity());
            System.out.println("CharBuffer.position:" + buffer.position());
            //原来c的位置被替换为e,并且position下移到下一个位置
            buffer.put('e');
            for(char a : charArray) {
                System.out.println(a);
            }
            System.out.println("CharBuffer.position:" + buffer.position());
            //原来d的位置被替换为f,并且position下移到下一个位置
            buffer.put('f');
            for(char a : charArray) {
                System.out.println(a);
            }
            System.out.println("CharBuffer.position:" + buffer.position());
            //已经满了,无法put
            buffer.put('g');
            
        }
    

    mark和reset的作用

    通过mark和reset可以很方便的在原来的地方重新写入或者读取缓存,这个特性在报文解析时很方便,如果是想读取ip报文内容,然后重写ip报文内容的时候,就显得十分方便;我们在ip报文头的位置设置一下mark,然后重这个位置开始读取,然后reset之后,在这个位置写入我们新加入的位置,这样就达到了篡改报文数据的目的

        /**
         * mark记录当前position的位置, reset重置上次记录的position位置
         */
        public static void markAndResetTest() {
            char[] charArray = new char[] {'a', 'b', 'c', 'd'};
            CharBuffer buffer = CharBuffer.wrap(charArray);
            //此时capacity和limit都为4
            System.out.println("CharBuffer.capacity:" + buffer.capacity());
            printArray(charArray);
            
            
            buffer.position(1);
            //记录当前开始设置数据的position
            buffer.mark();
            buffer.put('e');
            buffer.put('f');
            buffer.put('g');
            printArray(charArray);
            System.out.println("CharBuffer.remaining:" + buffer.remaining());
            //重置到上次开始存数据的位置
            buffer.reset();
            buffer.put('h');
            buffer.put('i');
            buffer.put('j');
            printArray(charArray);
            System.out.println("CharBuffer.remaining:" + buffer.remaining());
            
        }
    
    
        private static void printArray(char[] charArray) {
            for(char a : charArray) {
                System.out.print(a);
            }
            System.out.println();
        }
    

    相关文章

      网友评论

          本文标题:NIO-buffer各个属性介绍

          本文链接:https://www.haomeiwen.com/subject/itohxqtx.html