java nio 学习(一)

ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式:HeapByteBuffer是基于Java堆的实现,而DirectByteBuffer则使用了unsafe的API进行了堆外的实现。

ByteBuffer的常用参数和方法:

     Capacity:容量 。初始化的容量,一旦确定不能更改。如果插入的数据大于容量会出现java.nio.BufferOverflowException

     Position:当前位置

     Mark:对当前位置坐标记,可以根据需要再次指向这个位置

     Limit: 读写的上限。在写时 limit = capacity ,在读时 limit = 写入字符的最大长度。

Put : 向ByteBuffer写入数据。

Get:读ByteBuffer中的数据。

Filp : 一般写完数据时,要调用其方法,准备开始读取数据,这时position 变成0 ,limit 变成ButeBuffer 的字节长度,capactity 不变。

Clear: 把postion 变成0 单里面的数据并不清空。

 

   ByteBuffer buf = ByteBuffer.allocate(1024);

      System.out.println("--存入数据前--");

      System.out.println("limit:"+buf.limit());

      System.out.println("position:"+buf.position());

      System.out.println("capacity:"+buf.capacity());

      buf.put("abcdefg".getBytes());

      System.out.println("--存入数据后--");

      System.out.println("limit:"+buf.limit());

      System.out.println("position:"+buf.position());

      System.out.println("capacity:"+buf.capacity());

      buf.flip();

      System.out.println("--调用flip()方法后--");

      System.out.println("position:"+buf.position());

      System.out.println("limit:"+buf.limit());

      System.out.println("capacity:"+buf.capacity());

      byte[] b = newbyte[buf.limit()]; //如果读取时长度大于limit 会抛出异常

      buf.get(b);

      System.out.println("--读取玩数据后--");

      System.out.println("--调用flip()方法后--");

      System.out.println("position:"+buf.position());

      System.out.println("limit:"+buf.limit());

      System.out.println("capacity:"+buf.capacity());

  

打印结果:
       --
存入数据前--

limit:1024

position:0

capacity:1024

--存入数据后--

limit:1024

position:7

capacity:1024

--调用flip()方法后--

position:0

limit:7

capacity:1024

--读取玩数据后--

--调用flip()方法后--

position:7

limit:7

capacity:1024

测试clear 方法

   ByteBuffer buf = ByteBuffer.allocate(1024);

buf.flip();

buf.clear();

      System.out.println("--调用flip()clear--");

      System.out.println("position:"+buf.position());

      System.out.println("limit:"+buf.limit());

      System.out.println("capacity:"+buf.capacity());

       System.out.println("差距"+ buf.remaining());

      buf.put("ab".getBytes());

       System.out.println("差距"+ buf.remaining());

       byte[] cb = newbyte[10]; //如果读取时长度大于limit 会抛出异常

        buf.get(cb);

        System.err.println("数据"+new String(cb));//clear 只是把数据遗忘依然可以获取值 position 的位置变成了12 每读一位数据 position 就会移动一位

      buf.put("ef".getBytes());

      buf.flip();

      System.out.println("差距"+ buf.remaining());

      byte[] b = newbyte[buf.limit()]; //如果读取时长度大于limit 会抛出异常

      buf.get(b);

     

      System.err.println("数据"+new String(b));

      System.out.println("--调用flip()clear--");

      System.out.println("position:"+buf.position());

      System.out.println("limit:"+buf.limit());

      System.out.println("capacity:"+buf.capacity());

打印结果:

    --调用flip()clear--

position:0

limit:1024

capacity:1024

差距1024

差距1022

数据cdefg

猜你喜欢

转载自blog.csdn.net/hyhanyu/article/details/80270162