ByteBuffer

本文深入探讨Java NIO中的ByteBuffer工作原理,包括HeapByteBuffer和DirectByteBuffer的区别,以及mark、position、limit和capacity等关键概念。通过实例展示了ByteBuffer的创建、使用及方法如clear和compact的作用。

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

ByteBuffer是NIO中用的最多的缓存,ByteBuffer是一个抽象类,HeapByteBuffer 继承了ByteBuffer,DirectByteBuffer继承抽象类MappedByteBuffer,抽象类MappedByteBuffer继承了ByteBuffer

DirectByteBuffer 使用Native函数直接分配堆外内存,然后对一个存储在Java 堆里面的该对象作为这块内存的引用操作,这样在一些地方显著提高了性能,避免了Java堆和Native堆中来回的复制 。由于他是使用unsafe进行堆外实现,所以我们这里只说一下HeapByteBuffer 的实现。

mark:标志位,对当前position做标志。

position:从哪个位置开始读写元素,每次读或者写position+1

limit:表示缓存中实际存了多少元素,当limit和position相等时表示缓存中数据满了或者空了。

capacity:缓存区的容量,在ByteBuffer创建的时候定好的并且不能修改。 ByteBuffer.allocate(128);则capacity = 128。

创建缓冲区:其实就是在堆内存中创建一个byte[]数组

HeapByteBuffer 调用父类的方法 super(mark,post,lim,cap)

 

如果cap容量小于零抛出异常,反之设置容量值,lim值,pos值 分别调用limit(lim)和position(pos)方法

初始化limit的值。如果limit的值>缓存容量或者limit的值小于0就抛出异常,否则设置limit的值,如果position>limit则将position的值设置为limit,如果mark的值大于limit将limit的值设置为初始值-1.

初始化position的值 就不详细说了,看就能看懂的吧

clear()方法  不会把它里的内容清除,只是重置了position ,limit,mark 的值

在每次写完数据准备读的时候都会调用该方法,意思就是将一个处于存数据状态的缓冲区变为一个处于准备取数据的  

自己的理解:在存数据的时候postion指向的都是要存的下一个地址,该地址是一个空的;而在取数据的时候postion指向的是下一个要读取的地址,该地址是有值的。

 

public static void main(String[] args) {
    ByteBuffer byteBuffer = ByteBuffer.allocate(3);//[pos=2 lim=3 cap=3]
    byteBuffer.put((byte) 1);//[pos=1 lim=3 cap=3]
    byteBuffer.put((byte) 2);//[pos=2 lim=3 cap=3]
    System.out.println(byteBuffer);
    System.out.println(byteBuffer.remaining() + "************");
    System.out.println(byteBuffer.get() + ":111111111111111");//取的是pos=2位置的元素,该位置没有元素。取完之后把pos+1
    System.out.println(byteBuffer);//[pos=3 lim=3 cap=3]
    System.out.println(byteBuffer.remaining());
    byteBuffer.put(2, (byte) 3);
    System.out.println(byteBuffer);


}

结果是:

java.nio.HeapByteBuffer[pos=2 lim=3 cap=3]
1************
0:111111111111111
java.nio.HeapByteBuffer[pos=3 lim=3 cap=3]
0
java.nio.HeapByteBuffer[pos=3 lim=3 cap=3]

压缩缓冲区 compact()

public static void main(String[] args) {
    ByteBuffer byteBuffer = ByteBuffer.allocate(10);//[pos=2 lim=3 cap=3]
    byteBuffer.put((byte) 1);//[pos=1 lim=3 cap=3]
    byteBuffer.put((byte) 2);
    byteBuffer.put((byte) 3);
    byteBuffer.put((byte) 4);
    System.out.println(byteBuffer);
    System.out.println(byteBuffer.remaining());
    byteBuffer.compact();
    System.out.println(byteBuffer);

结果是:

java.nio.HeapByteBuffer[pos=4 lim=10 cap=10]
6
java.nio.HeapByteBuffer[pos=6 lim=10 cap=10]

 

 

转载于:https://my.oschina.net/u/3738404/blog/2245554

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值