上一篇介绍了一些缓冲区的基本属性,这一片来说说缓冲区的压缩
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创建的都是非直接缓冲区