龙之秘境java_Java-彻底弄懂netty-程序员深入理解NIO怎么操作buffer-知识铺

知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。

一、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.读写效率高,直接操作堆外内存,不需要拷贝。

157e998fa0845a8fb5afb55a2a2c4ae6.png

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 表示最大可以读取多少。

8b96ac74d0431721fdb5fc4af6428a07.png

五、buffer种类

每种基本类型对应的buffer

ByteBuffer

MappedByteBuffer 操作大文件,读写性能高。

CharBuffer

DoubleBuffer

FloatBuffer

IntBuffer

LongBuffer

ShortBuffer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值