首页 > 其他分享 >9.NIO 核心1:缓冲区(Buffer)

9.NIO 核心1:缓冲区(Buffer)

时间:2022-08-16 20:34:57浏览次数:46  
标签:NIO Buffer System buffer limit 缓冲区 println out

static xxxBuffer allocate(int capacity):创建一个容量为capacity 的xxxBuffer对象

 

 

样例:
     @Test
    public void test01() {
        //1.分配一个缓冲区,容量设置为10
        ByteBuffer buffer = ByteBuffer.allocate(10);
        //返回当缓冲区的当前位置
        System.out.println(buffer.position());//0
        //返回缓冲区的limit界限位置
        System.out.println(buffer.limit());//10
        //返回缓冲区的容量
        System.out.println(buffer.capacity());//10
        System.out.println("=================================");

        //2.往缓冲区中放数据
        String name = "wumengda";
        buffer.put(name.getBytes());
        //返回当缓冲区的当前位置
        System.out.println(buffer.position());//8
        //返回缓冲区的limit界限位置
        System.out.println(buffer.limit());//10
        //返回缓冲区的容量
        System.out.println(buffer.capacity());//10
        System.out.println("=================================");

        //3.Buffer flip() 将缓冲区的界限设置为当前位置,并将当前位置设置为0:可读模式
        buffer.flip();
        //返回当缓冲区的当前位置
        System.out.println(buffer.position());//0
        //返回缓冲区的limit界限位置
        System.out.println(buffer.limit());//8
        //返回缓冲区的容量
        System.out.println(buffer.capacity());//10


        //4.get数据获取
        char ch= (char) buffer.get();
        System.out.println(ch);//w
        //返回当缓冲区的当前位置
        System.out.println(buffer.position());//1
        //返回缓冲区的limit界限位置
        System.out.println(buffer.limit());//8
        //返回缓冲区的容量
        System.out.println(buffer.capacity());//10
    }
样例2:clear的使用
  @Test
    public void test02() {
        ByteBuffer buffer = ByteBuffer.allocate(10);
        String name = "wumengda";
        buffer.put(name.getBytes());
        //返回当缓冲区的当前位置
        System.out.println(buffer.position());//8
        //返回缓冲区的limit界限位置
        System.out.println(buffer.limit());//10
        //返回缓冲区的容量
        System.out.println(buffer.capacity());//10
        System.out.println("=================================");

        buffer.flip();
        byte[] b = new byte[2];
        buffer.get(b);
        System.out.println(new String(b));//wu
        //返回当缓冲区的当前位置
        System.out.println(buffer.position());//2
        //返回缓冲区的limit界限位置
        System.out.println(buffer.limit());//8
        //返回缓冲区的容量
        System.out.println(buffer.capacity());//10
        System.out.println("=================================");

        //重点1:clear 清空缓冲区,发现并不是真的清空,是将position置为0,limit和capacity置为最大,此时如果再放值,会进行覆盖
        buffer.clear();
        //返回当缓冲区的当前位置
        System.out.println(buffer.position());//0
        //返回缓冲区的limit界限位置
        System.out.println(buffer.limit());//10
        //返回缓冲区的容量
        System.out.println(buffer.capacity());//10
        char ch = (char) buffer.get();
        System.out.println(ch);//w
        //返回当缓冲区的当前位置
        System.out.println(buffer.position());//1
        //返回缓冲区的limit界限位置
        System.out.println(buffer.limit());//10
        //返回缓冲区的容量
        System.out.println(buffer.capacity());//10

    }

 

样例3:mark和resert的使用(标记和重置) 
@Test
    public void test02() {
        ByteBuffer buffer = ByteBuffer.allocate(10);
        String name = "wumengda";
        buffer.put(name.getBytes());
        //返回当缓冲区的当前位置
        System.out.println(buffer.position());//8
        //返回缓冲区的limit界限位置
        System.out.println(buffer.limit());//10
        //返回缓冲区的容量
        System.out.println(buffer.capacity());//10
        System.out.println("=================================");

        buffer.flip();
        byte[] b = new byte[2];
        buffer.get(b);
        System.out.println(new String(b));//wu
        //返回当缓冲区的当前位置
        System.out.println(buffer.position());//2
        //返回缓冲区的limit界限位置
        System.out.println(buffer.limit());//8
        //返回缓冲区的容量
        System.out.println(buffer.capacity());//10
        System.out.println("=================================");

        //重点:标记当前位置,后面可以resert
        buffer.mark();
        byte[] by = new byte[3];
        buffer.get(by);
        System.out.println(new String(by));//men
        //返回当缓冲区的当前位置
        System.out.println(buffer.position());//5
        //返回缓冲区的limit界限位置
        System.out.println(buffer.limit());//8
        //返回缓冲区的容量
        System.out.println(buffer.capacity());//10
        System.out.println("=================================");
        buffer.reset();
        if (buffer.hasRemaining()){
            System.out.println("buffer剩余:"+buffer.remaining());//6
        }
        //返回当缓冲区的当前位置
        System.out.println(buffer.position());//2
        //返回缓冲区的limit界限位置
        System.out.println(buffer.limit());//8
        //返回缓冲区的容量
        System.out.println(buffer.capacity());//10
    }

直接内存的使用场景:

  1.有很大的数据需要存储,他的生命周期又很长

  2.适合频繁操作的io操作,比如网络并发场景

   @Test
    public void test3(){
        ByteBuffer buffer=ByteBuffer.allocate(1024);
        //判断是不是直接内存
        System.out.println(buffer.isDirect());//false
        //创建直接内存
        ByteBuffer byteBuffer=ByteBuffer.allocateDirect(1024);
        System.out.println(byteBuffer.isDirect());//true
    }

 

标签:NIO,Buffer,System,buffer,limit,缓冲区,println,out
From: https://www.cnblogs.com/wmd-l/p/16592864.html

相关文章

  • C语言`union`及`位域`
    C语言union及位域1.unionunion就相当于一个类型不固定的变量,存储大小由union内最长的变量决定,存储空间共享,访问内部不同的变量,就会以相应的变量规范对内存进行解析,以如下......
  • 【StoneDB研发日志】union功能bug记录
    1、问题现象createdatabasesyw_mtr;usesyw_mtr;CREATETABLEt1(f1VARCHAR(255)CHARACTERSETutf8)engine=tianmu;CREATETABLEt2ASSELECTLEFT(f1,171)AS......
  • 8.java NIO
    1.简介2.NIO和BIO的比较1.BIO以流的方式处理数据,而NIO以块的放还是处理数据,块的I/O都效率比流的I/O高很多2.BIO是阻塞的,NIO是非阻塞的3.BIO基于字节流或者字符流进行......
  • StringBuffer和StringBuilder
    StringBuffer线程安全;执行效率:StringBuilder> StringBuffer>String ......
  • Java NIO全面详解(看这篇就够了)
    很多技术框架都使用NIO技术,学习和掌握JavaNIO技术对于高性能、高并发网络的应用是非常关键的@mikechenNIO简介NIO中的N可以理解为Non-blocking,不单纯是New,是解决......
  • Netty - ByteBuffer
     一、ByteBuffer使用    二、ByteBuffer结构      三、ByteBuffer常见API3.1分配空间allocateV.S.allocateDirect ......
  • Netty - NIO基础
     一、NIO的三大组件1.1Channel 常见的Channel有:FileChannel--文件传输通道DatagramChannel--UDP数据传输通道SocketChannel--TCP数据传输通道(客户端,服......