相同点:调用完compcat和clear方法之后的buffer对象一般都是继续往该buffer中写入数据的
不同点:
(1)clear是把position=0,limit=capcity等,也就是说,除了内部数组,其他属性都还原到buffer创建时的初始值,而内部数组的数据虽然没赋为null,但只要不在clear之后误用buffer.get就不会有问题,正确用法是使用buffer.put从头开始写入数据;
(2)而compcat是把buffer中内部数组剩余未读取的数据复制到该数组从索引为0开始,然后position设置为复制剩余数据后的最后一位元素的索引+1,limit设置为capcity,此时在0~position之间是未读数据,而position~limit之间是buffer的剩余空间,可以put数据。
使用场景:
当buffer被读取过,但想继续复用buffer时,可以执行compact把剩余未读取数据往缓冲数据前面移动,compact移动完后,可以再次使用put往该buffer里put数据,此时数据会被写到剩余数据之后。
看源码:当buffer被get读取了部分数据之后,还剩下position~limit之间的字节没有被读取。然后....
public ByteBuffer compact() {
//buffer内部数组的position~limit之间的字节移动到buffer内部数组的最开始位置。。
//比如当前position索引位置的字节移到0位置,position+1的字节移动到1位置,以此类推,直到limit位置的移动完位置。
System.arraycopy(hb, ix(position()), hb, ix(0), remaining());
//当前position设置为剩余字节数(limit-position),即在剩余字节的最后一个字节的下一个索引。
position(remaining());
//limit设置为当前buffer创建时的容量capacity(内部数据的长度)
limit(capacity());
discardMark();
return this;
}
执行完压缩操作之后,当前buffer处于可写入状态了。往里put数据就是继续往剩余数据后面增加。