微信做一个小程序需要多少钱,成都seo工程师,绵阳 网站建设,最近几天新闻大事ByteBuffer是字节缓冲区#xff0c;主要用户读取和缓存字节数据#xff0c;多用于网络编程#xff0c;原生的类#xff0c;存在不好用#xff0c;Netty采用自己的ByteBuff#xff0c;对其进行了改进
1.ByteBuffer的2种创建方式 1.ByteBuffer buf ByteBuffer.allocate(i…ByteBuffer是字节缓冲区主要用户读取和缓存字节数据多用于网络编程原生的类存在不好用Netty采用自己的ByteBuff对其进行了改进
1.ByteBuffer的2种创建方式 1.ByteBuffer buf ByteBuffer.allocate(int size); 方式1的buf缓冲区存储在堆内存中内存开销在JVM中受GC影响会多拷贝一次因为java程序收到的数据首先被系统内存所获取然后再拷贝给JVM
2.ByteBuffer buf ByteBuffer.allocateDirect(int size); 方式2的buf在系统直接内存中创建内存开销在JVM之外读写效率高(不受GC影响0拷贝)但是分配效率低使用后若不释放会造成内存泄漏
下图是不同容量情况下两种ByteBuffer的读写效率根据需求选择创建方式 2.字符串转成ByteBuffer的3三种方式 方式1: 采用put()方法,读数据时需要调用flip()切换为读模式
ByteBuffer buf ByteBuffer.allocate(int size);buf.put(msg.getBytes()); 方式2以特定编码格式将String转换为ByteBuffer
ByteBuffer buffer1 StandardCharsets.UTF_8.encode(hello); 方式3调用ByteBuffer.wrap()
ByteBuffer buf ByteBuffer.wrap(msg.getBytes()); 3.Bytebuffer的读写底层原理 Bytebuffer的数据读写主要采用三个参数来控制
1.position起始下标 2.limit限制下标 3.capacitybuffer的容量 核心思想Bytebuffer的读写共用position、limit参数因此需要切换至读模式(调用flip())和写模式(调用)
一.开始时position指向0limit指向capacity 二.写模式下写数据时Position会不断前移 三.调用flip()切换为读模式此时Postion置为已有数据的起始下标limit置为已有数据的末尾下标 四.调用clear()方法切换为写模式采用清空缓冲区将potision置为0limit置为capacity 至此我们知道读写模式由于共用相同的position等参数因此需要切换模式才能正确的读写。
并且在发生一次写读(先写后读)切换后需要调用clear()方法进行重置才能进行一轮新的写读
当然你可以连续写或连续读读读或写写可以连续执行不需要额外操作。例如
ByteBuffer buf ByteBuffer.allocate(int size);buf.put(msg.getBytes()); //okbuf.put(msg2.getBytes()); //ok
存在的问题
读操作后重新写调用clear()会重置至0的问题如果没有读完呢
例如 存在接收到的数据是不完整的无法进行读操作那么需要在原来的基础上继续写数据怎么办
答案是 Buffer.compact() 切换到写入模式
五. 调用compact方法切换为写模式在不清空缓冲区的前提下继续写如信息将未读取的数据前移postion指针置为未读取数据的末尾下标limit置为capacity 上图左侧灰色是已读部分数据绿色是未读部分在此基础上调用compact继续写会进行部分清楚操作同时保留未读部分这也是推荐的用法。