NIO: (一)Buffer的理解

一、Buffer 的基本用法:

  1. Write data into the Buffer
  2. Call buffer.flip()
  3. Read data out of the Buffer
  4. Call buffer.clear() or buffer.compact()
二、Buffer 的常用方法:
1. ByteBuffer.allocate(48);   ----->  java.nio.HeapByteBuffer[pos=0 lim=48 cap=48]
分配的是堆上内存,GC可以直接回收。

2. ByteBuffer.allocateDirect(48);  -----> java.nio.DirectByteBuffer[pos=0 lim=48 cap=48]
分配的是堆外内存,即操作系统的直接内存,buffer的内存区域不受GC管理。
但jdk做了封装,他关联了一个Cleaner对象,在回收cleaner 对象时,会申请操作系统来回收这块内存区域。
也就是说,内存的回收也不需要我们手动管理了!

3. clear() and compact() 
clear(): 转为写模式,position置为0;
compact():  转为写模式,compact()将所有未读数据复制到开头Buffer。然后它position在最后一个未读元素之后设置。该limit仍然设置为capacity,就像clear()那样。现在Buffer已准备好写入,但您不会覆盖未读数据。
    public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }
    public ByteBuffer compact() {

        System.arraycopy(hb, ix(position()), hb, ix(0), remaining());
        position(remaining());
        limit(capacity());
        discardMark();
        return this;

    }

compact(): 未读完数据,被保留。可以在写后,继续读取,clear()会覆盖。

参考: http://tutorials.jenkov.com/java-nio/buffers.html#clear

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值