你不知道的java nio缓冲区(二)

本文介绍了缓冲区的压缩方法compact(),该方法可以清除已释放的数据并重置position和limit值。此外,还讨论了缓冲区的mark属性及其reset方法的作用。最后对比了直接缓冲区与间接缓冲区的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇介绍了一些缓冲区的基本属性,这一片来说说缓冲区的压缩

public abstract class ByteBuffer extends Buffer implements Comparable {

    public abstract ByteBuffer compact();

}

有时,我们可能指向从缓冲区中取出部分数据来,然后重新填充,compact方法会为你完成这些事情,它的作用就是将已经释放的数据丢掉,保留未释放的数据,并且将position的值设置为剩余数量的大小加1,将limit设置为compacity。


若开始的缓冲区如上图所示,则调用buffer.compact()方法之后,缓冲区将如下图所示:


缓冲区还有一个mark属性,这个属性是记住前一个position的位置。当调用缓冲区的reset方法时,如果设置了mark,则将mark=position,如果没有设置,则会抛出InvalidMarkException异常。

如果调用buffer.position(2).mark().position(4),则缓冲区将如下图所示:


如果读取这个缓冲区,则会读取到MW,然后位置会前进到6,接着如果再调用reset()方法,则会将位置设置为mark标记的位置,再读取缓冲区,则会返回owMW

直接缓冲区和间接缓冲区:

   间接缓冲区:将缓冲区中的内容复制到临时缓冲中,再使用临时缓冲执行底层I/O操作

   直接缓冲区:直接执行底层I/O操作,它位于标准JVM堆栈之外,它不受垃圾回收的支配。

这两个概念其实主要有两点:1.JVM堆栈和是否要多经过一步操作才能执行I/O。

直接缓冲区的创建也很简单:buffer.allocateDirect(int capacity),像allocation方法和wrap创建的都是非直接缓冲区


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值