知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。
一、Buffer使用场景
主要和Channel通道打交道,无论是从通道里读数据到Buffer中,还是从Buffer中数据写入到通道中,都离不开Buffer。
二、Buffer本质
Buffer缓冲区本质是一块连续的内存,NIO把这块缓冲区封装成对象,对外提供一组遍历的方法,来操作这块缓冲区。
三、Buffer基本方法
3.1 开辟缓冲区方法
3.1.1 ByteBuffer.allocate(1024) :
a.开辟一块1024字节的连续空间。
b.创建的缓存区是在JVM堆上,也叫做堆字节缓存区。
c.这种缓冲区有个过程,用户空间和内核空间上数据拷贝动作。
d.由于是在堆上操作,创建效率高。适合频繁创建buffer场景。
e.读写效率低,用户态和内核态有个数据拷贝过程。
3.1.2 ByteBuffer.allocateDirect(1024);
a.开辟一块1024字节,堆外内存区。
b.直接在系统内存中创建一段连续的缓冲区。
c.真正意义上的零拷贝。
d.创建效率低,适合低频创建buffer场景。
e.读写效率高,直接操作堆外内存,不需要拷贝。
3.2 从通道到buffer方法
xxChannel.read(buf); 从通道内读取数据,写入大buffer中。
3.3 切换buffer模式
buf.flip(); 切换读取数据的模式
3.4 判断buffer是否被读取完毕
buf.hasRemaining() 循环判断buffer是否被读完
3.5 读buffer内容
buf.get() 从buffer中读取内容,同时内部标志位会移动。
四、buffer 原理
三个属性:capacity、position、limit
4.1 capacity 缓冲区的容量,固定大小
4.2 position
写模式: 下一个可写入位置
读模式: 置为0号位置。
4.3 limit
写模式: limit和capacity相等,
表示最大可以写入多少。
读模式: limit 表示最大可以读取多少。
五、buffer种类
每种基本类型对应的buffer
ByteBuffer
MappedByteBuffer 操作大文件,读写性能高。
CharBuffer
DoubleBuffer
FloatBuffer
IntBuffer
LongBuffer
ShortBuffer
如果对您有用,请轻轻的轻轻的点下赞。
领取专属 10元无门槛券
私享最新 技术干货