ByteBuffer是NIO中用的最多的缓存,ByteBuffer是一个抽象类,HeapByteBuffer 继承了ByteBuffer,DirectByteBuffer继承抽象类MappedByteBuffer,抽象类MappedByteBuffer继承了ByteBufferjava
DirectByteBuffer 使用Native函数直接分配堆外内存,而后对一个存储在Java 堆里面的该对象做为这块内存的引用操做,这样在一些地方显著提升了性能,避免了Java堆和Native堆中来回的复制 。因为他是使用unsafe进行堆外实现,因此咱们这里只说一下HeapByteBuffer 的实现。数组
mark:标志位,对当前position作标志。缓存
position:从哪一个位置开始读写元素,每次读或者写position+1app
limit:表示缓存中实际存了多少元素,当limit和position相等时表示缓存中数据满了或者空了。函数
capacity:缓存区的容量,在ByteBuffer建立的时候定好的而且不能修改。 ByteBuffer.allocate(128);则capacity = 128。post
建立缓冲区:其实就是在堆内存中建立一个byte[]数组性能
HeapByteBuffer 调用父类的方法 super(mark,post,lim,cap)spa
若是cap容量小于零抛出异常,反之设置容量值,lim值,pos值 分别调用limit(lim)和position(pos)方法3d
初始化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]