java入门 Netty ByteBuf

一、 参考资料

参考黑马netty教程
https://www.bilibili.com/video/BV1py4y1E7oA?p=88&spm_id_from=pageDriver&vd_source=4cd1b6f268e2a29a11bea5d2568836ee

二、 ByteBuf测试

app.java

package com.sht.test;import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.channel.WriteBufferWaterMark;/*** Hello world!**/
public class App {public static void main(String[] args) {// ==============================================================// 自动扩容//buffer()方法使用直接内存,heapBuffer()方法使用堆内存ByteBuf buffer1 = ByteBufAllocator.DEFAULT.buffer();printByteBuffer("写数据前",buffer1);for (int i = 0; i < 300; i++) {buffer1.writeByte(i);}		printByteBuffer("写数据后",buffer1);System.out.println("--------------------------------------------");// ==============================================================//写入,以write开头函数,会改变写指针//修改,以set开头的函数,不会改变写指针//读取,以read开头函数,会改变读指针// ==============================================================// 重复读取ByteBuf buffer2 = ByteBufAllocator.DEFAULT.buffer();buffer2.writeInt(1);buffer2.writeInt(2);printByteBuffer("写入两个int容量",buffer2);System.out.println("读取int:" + buffer2.readInt());printByteBuffer("读取1个int后容量",buffer2);buffer2.markReaderIndex();System.out.println("读取int:" + buffer2.readInt());printByteBuffer("读取2个int后容量",buffer2);buffer2.resetReaderIndex();printByteBuffer("reset读指针后",buffer2);System.out.println("--------------------------------------------");// ==============================================================// 内存回收//release()方法使得引用计数-1,计数为0时触发回收//retain()方法使得引用计数+1// ==============================================================// 零拷贝ByteBuf buffer3 = ByteBufAllocator.DEFAULT.buffer();for(int i=0;i<4;i++) {buffer3.writeInt(i+1);}ByteBuf buffer3_1 = buffer3.slice(0, 8);printByteBuffer("完整buffer",buffer3);printByteBuffer("分片1",buffer3_1);System.out.println("--------------------------------------------");//释放原有ByteBuf会影响分片ByteBuf,可以使用retain()//duplicate,全拷贝,读写指针独立//copy开头的方法,深拷贝// ==============================================================// coposite 组合小的ByteBuf为一个大的ByteBuf// ==============================================================// 零拷贝ByteBuf buffer4 = ByteBufAllocator.DEFAULT.buffer();int writeNum = Integer.MAX_VALUE;for(int i=0;i<writeNum;i++) {buffer4.writeInt(i+1);buffer4.readInt();if(i % 100000 == 0 && buffer4.readableBytes() == 0){//printByteBuffer("修改前"+i,buffer4);buffer4.readerIndex(0);buffer4.writerIndex(0);//printByteBuffer("修改后"+i,buffer4);}}printByteBuffer("读写结束后",buffer4);System.out.println("--------------------------------------------");}public static void printByteBuffer(String msg,ByteBuf buffer) {System.out.println(String.format("%s:读指针:%d,写指针:%d,容量:%d", msg,buffer.readerIndex(),buffer.writerIndex(),buffer.capacity()));}
}//运行结果
/*
写数据前:读指针:0,写指针:0,容量:256
写数据后:读指针:0,写指针:300,容量:512
--------------------------------------------
写入两个int容量:读指针:0,写指针:8,容量:256
读取int:1
读取1个int后容量:读指针:4,写指针:8,容量:256
读取int:2
读取2个int后容量:读指针:8,写指针:8,容量:256
reset读指针后:读指针:4,写指针:8,容量:256
--------------------------------------------
完整buffer:读指针:0,写指针:16,容量:256
分片1:读指针:0,写指针:8,容量:8
--------------------------------------------
读写结束后:读指针:334584,写指针:334584,容量:524288
--------------------------------------------
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android基础-Jetpack Compose

Jetpack Compose&#xff0c;作为Android平台上一款革命性的UI框架&#xff0c;自其推出以来就受到了广大开发者的热烈关注和广泛应用。它不仅简化了Android应用的UI开发流程&#xff0c;提高了开发效率&#xff0c;而且为开发者带来了更直观、更灵活、更强大的UI定义方式。下面…

Linux——简单指令汇总

Linux&#xff0c;一般指GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff0c;它主要受到Minix和Unix思想的启发&#xff0c;是一个…

C++ | Leetcode C++题解之第130题被围绕的区域

题目&#xff1a; 题解&#xff1a; class Solution { public:const int dx[4] {1, -1, 0, 0};const int dy[4] {0, 0, 1, -1};void solve(vector<vector<char>>& board) {int n board.size();if (n 0) {return;}int m board[0].size();queue<pair<…

C++类的继承与派生概念

派生和继承是自然界普遍存在的一种现象。例如&#xff0c;“猫”和“白猫”。当人们谈及“猫”时&#xff0c;知道它有4条腿&#xff0c;1条尾巴&#xff0c;抓老鼠,为哺乳动物。如谈论“白猫”时&#xff0c;它也是猫&#xff0c;只不过增加了一个新的特征&#xff0c;即它的毛…

Flutter 中的 KeepAlive 小部件:全面指南

Flutter 中的 KeepAlive 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它允许开发者使用 Dart 语言构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中&#xff0c;KeepAlive 是一个用于维护组件活跃状态的组件&…

Redis缓存(笔记二:Redis常用五大数据类型)

目录 1、Redis中String字符串 1.1 常用命令解释&#xff1a; 1.2 原子性 1.3 具有原子性的常用命令 1.4 String数据结构 1、Redis中String字符串 概念 String 是 Redis 最基本的类型&#xff0c;可以理解成与 Memcached 一模一样的类型&#xff0c;一个 key对应一个 value…

软设之排序算法对比

直接插入 时间复杂度:平均情况为O(n^2)。特殊情况下基本有序最优为O(n) 空间复杂度:O(1) 希尔排序 时间复杂度:平均情况O(n^1.3) 空间复杂度:O(1) 直接选择排序 时间复杂度:O(n^2) 空间复杂度:O(1) 堆排序 时间复杂度:O(nlog(2)n) 空间复杂度:O(1) 冒泡排序 时间…

第6章:数据库设计基础知识

数据库基本概念 数据(Data)是描述事物的符号记录&#xff0c;它具有多种表现形式&#xff0c;可以是文字、图形、图像、声音和语言等。数据库系统(DataBase System&#xff0c;DBS)是一个采用了数据库技术&#xff0c;有组织地、动态地存储大量相关联数据&#xff0c;从而方便多…

3162. 优质数对的总数 I

给你两个整数数组 nums1 和 nums2&#xff0c;长度分别为 n 和 m。同时给你一个正整数 k。 如果 nums1[i] 可以被 nums2[j] * k 整除&#xff0c;则称数对 (i, j) 为 优质数对&#xff08;0 < i < n - 1, 0 < j < m - 1&#xff09;。 返回 优质数对 的总数。 示…

第100天:权限提升-数据库RedisPostgre第三方软件TV向日葵服务类

目录 思维导图 案例一: 数据库-Redis 数据库权限提升-计划任务 案例二: 数据库-PostgreSQL 数据库权限提升-漏洞 PostgreSQL 提权漏洞&#xff08;CVE-2018-1058&#xff09; PostgreSQL 高权限命令执行漏洞&#xff08;CVE-2019-9193&#xff09; 案例三: 三方应用-…

【数据结构与算法 经典例题】(C语言)反转链表图文详解

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法 经典例题》C语言 期待您的关注 ​ 目录 一、问题描述 二、解题思路分析 三、代码实现 一、问题描述 二、解题…

c++ 函数作为参数

在C中&#xff0c;函数指针或函数对象可以作为参数传递给另一个函数&#xff0c;实现了函数的动态调用和灵活性。这种机制在回调函数、事件处理、泛型编程等领域中非常有用。 1.函数指针作为参数&#xff1a; 函数指针可以指向特定函数&#xff0c;并被用作参数传递给另一个函数…

uniapp使用uQRCode页面不显示也不报错

我使用的版本是&#xff1a;4.0.6 引入到项目中后根据官方的配置教程进行配置&#xff1a; 但是页面上就是不显示&#xff0c;也不报错&#xff0c;看官网发现步骤也没问题 解决方法&#xff1a; 这句话代表的是uQrcode会被自动引用注册&#xff0c;但是你引过组件库或者别的…

Java进阶学习笔记37——正则表达式

正则表达式&#xff1a; 就是由一些特定的字符组成的&#xff0c;代表的是一个规则。 作用&#xff1a; 1&#xff09;用来校验数据格式是否合法&#xff1b; 校验电话号码是否合法&#xff1b; 校验邮箱是否合法&#xff1b; 用户输入的QQ号码是否合法&#xff1b; 2&…

QT treeWidget如何添加虚线

1、添加以下代码即可&#xff1a; ui.treeWidget->setStyle(QStyleFactory::create("windows"));2、效果如下&#xff1a;

基于 vue-element-template 框架添加 tagsview

1. 需求 vue-element-template 是一个基础模板&#xff0c;默认没有 tagsview。所以要手动添加。 参考最全面的集成方案框架 vue-element-admin &#xff0c;拷贝和修改相关文件到你的项目中。 2. 修改 复制如下文件或文件夹 \src\layout\components\TagsView\src\store\mo…

Windows11+Ubuntu24.04双系统安装及配置

目录 0. 前言1. Ubuntu24.04的安装2. Ubuntu24.04的配置2.1 基本配置2.2 开发环境配置 0. 前言 我去年在做一个项目的时候需要用到ros&#xff0c;ros需要运行在Ubuntu系统上。但我的笔记本电脑配置不是很好&#xff0c;采用虚拟机运行的想法随之被否决&#xff0c;决定采用安…

【ZZULI数据结构实验四】:C语言排序算法大比拼

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…

分离式光电液位传感器与浮球开关相比具有哪些优势

分离式光电液位传感器与浮球开关相比有哪些优势&#xff1f;分离式光电液位传感器依据光学原理&#xff0c;在传统光学传感器的基础上进行了改进。其特点是将光学组件分离出来&#xff0c;置于水箱外部感应&#xff0c;而传感器本身则独立于水箱外。这种设计有效解决了浮球开关…

EtherCAT 和 UDP 通讯的实时性 区别

EtherCAT 和 UDP 是两种不同的通信协议&#xff0c;它们在实时性方面有着本质的区别&#xff0c;主要体现在以下几个方面&#xff1a; 实时性设计目的&#xff1a; EtherCAT 是专为工业自动化设计的实时以太网协议&#xff0c;它通过独特的数据通信机制实现了极高的实时性能。E…