自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(84)
  • 收藏
  • 关注

原创 Java IO 流详解:从入门到实战,一文彻底掌握 Java 文件读写

IO(Input / Output)即输入与输出,用于实现程序与外部设备之间的数据交换。这里的“外部设备”包括:磁盘文件键盘输入控制台输出网络连接数据库打印机等读取文件磁盘 ---> 程序对于程序来说:磁盘的数据进入程序,因此属于输入(Input)。程序 ---> 文件程序将数据写入磁盘,因此属于输出(Output)。数据流向程序,就是输入;数据从程序流出,就是输出。Java IO 是 Java 基础中的重要组成部分,也是文件处理和网络编程的基础。理解。

2026-07-21 06:16:45 330

原创 Java 文件(File)操作详解,一文掌握 File 类的常见用法

很多初学者第一次接触 File 时,都会认为它代表一个真正的文件。其实并不是。File 类表示的是一个文件或者目录的抽象路径。File 对象仅仅保存了一个路径信息,并不代表这个文件一定存在。这里只是创建了一个 File 对象。并不会创建 demo.txt 文件。如果该路径不存在,也不会报错。只有真正调用创建文件的方法时,磁盘中才会生成对应文件。方法作用exists()判断是否存在创建文件mkdir()创建目录mkdirs()创建多级目录delete()删除isFile()

2026-07-21 06:08:35 177

原创 Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理

是 Spring MVC 提供的一个接口,用于接收客户端上传的文件。当前端通过上传文件时,浏览器会采用编码格式发送 HTTP 请求,SpringMVC 会自动解析请求,并封装成对象。MultipartFile 本质上就是 SpringMVC 对上传文件的一层封装。开发者无需自己解析 HTTP 请求体,只需要接收即可。Spring 会自动完成以下工作:接收 HTTP 请求解析 multipart/form-data提取上传文件封装成 MultipartFile。

2026-07-21 06:07:40 179

原创 Java + Spring Boot 操作 Kafka 完整学习指南

前置条件:ZooKeeper 集群 + Kafka 集群已启动(3个ZK节点 + 3个Broker) Broker 地址:172.17.0.7:9092, 172.17.0.7:9093, 172.17.0.7:9094。

2026-05-24 15:03:26 374

原创 Kafka 零基础实操命令大全

前面我们吃透了 Kafka的核心底层原理,理论落地必须依靠实操命令。Kafka 日常开发、测试、集群运维的核心操作,全部依赖自带的 shell 命令。本文整理的 Kafka 命令,按「主题管理、消息生产消费、集群运维、分区副本、偏移量查询」分类,搭配详细参数解析、实操场景、避坑说明,新手直接复制即用,完美搭配上篇原理博文,做到。:本文命令基于 Kafka 2.x/3.x 新版本,统一使用(废弃旧版方式),适配所有新版集群。

2026-05-24 15:02:37 520

原创 零基础吃透Kafka核心:主题、分区、副本最全实战解析

Topic(主题):纯逻辑抽象概念,是业务层面的消息分类、订阅入口。全局唯一、集群共享,元数据存储在Zookeeper中,不属于集群中任何一台Broker节点。生产者发消息、消费者订阅消息,只对接Topic,无需关心底层数据存储。Partition(分区):Kafka的最小数据存储单元,真实的消息数据都存在分区中。一个Topic可以拆分为多个分区,目的是并行读写、提升集群吞吐量。Replica(副本):分区的备份数据,为了保证高可用、防止节点宕机数据丢失。副本不属于新分区,只是同一个分区的多份拷贝。误区1。

2026-05-24 14:51:34 361

原创 ZooKeeper + Kafka 集群搭建实战记录

只要看到报错。

2026-05-24 14:48:54 502

原创 从零入门 Kafka:Java 原生 API 到 Spring Boot 实战全解析

Data@Data// 当前累计充电量// 当前累计费用// 电费单价// 服务费单价// 计费规则名称(尖峰平谷)// 充电时长(ms)// 事件时间戳功能原生 API生产消息消费消息+ while 循环注解手动提交序列化手动配置 Serializeryml 配置或@Bean配置类创建 Topic命令行或 AdminClient自动创建死信队列手动捕异常转发重试手动实现选型建议学习和理解底层原理 → 先玩原生 API。

2026-05-21 16:02:11 677

原创 Spring Boot WebSocket 两种集成方式深度解析

WebSocket 是实现服务器主动推送、实时通信的利器,常见于聊天室、消息通知、实时监控大屏等场景。Spring Boot 集成 WebSocket 有两条路把两套配置混用了。两种方式各自的工作原理各自的完整配置步骤最容易踩的坑(以及为什么会踩)选型建议原生Spring配置类Bean+ 实现处理器@Component实现@ComponentBean 注入必须用static字段 + setter 注入直接@Autowired,无限制实例模型每连接一个新实例全局单例互相混用。

2026-05-21 09:50:45 596

原创 为什么 MqttConsumer 不交给 Spring 管理?——从一个充电桩项目说起

1. 并非所有的类都需要交给 Spring 管理。Spring 容器管理的是需要在多处共享、需要享受 Spring 生命周期特性(如依赖注入、AOP、事务等)的对象。像这样的回调类,它的生命周期完全依附于MqttClient,由MqttClient负责持有和调用,不需要被其他地方注入,没有必要进容器。2. 谁创建,谁负责。是在的@Bean方法里创建的,它的生命周期就交给MqttClientBean 来负责。这种"就近创建、就近管理"的原则能有效避免对象归属不清的问题。

2026-05-03 18:36:04 401

原创 在 Spring Boot 项目中使用 WebSocket 实现实时通信

1. 引入 spring-boot-starter-websocket 依赖↓2. 注册 ServerEndpointExporter Bean(内置Tomcat必须)↓3. 编写 @ServerEndpoint 端点类实现 @OnOpen / @OnMessage / @OnClose / @OnError↓4. 用 ConcurrentHashMap 管理所有在线 Session↓5. 业务代码调用静态方法主动推送消息↓6. 前端用 new WebSocket(url) 建立连接。

2026-03-23 11:17:02 616

原创 Redis GEO,一个被我低估的功能

用 Redis GEO 之前,我觉得地理位置查询是个复杂的事,各种三角函数、坐标系转换,很难搞。真正用起来之后发现,几条命令就能解决大部分场景,难的部分 GeoHash 都替你处理掉了。但了解 GeoHash 的底层原理还是有必要的——知道它是用 ZSet 存的、知道边界问题的存在、知道为什么不能直接操作 score,这些细节在排查问题的时候都有用。另外坐标系那个坑,国内项目一定要提前想好,否则数据都存进去了才发现距离对不上,改起来很麻烦。

2026-03-18 23:16:54 602

原创 Canal 过时了?我不这么认为

学一个技术,把它的来龙去脉搞清楚,比只会用它配置更重要。Canal 这个项目,让我真正理解了 MySQL 主从复制协议、binlog 的结构、缓存一致性的几种方案和各自的取舍。这些知识不会因为 Canal 热不热门而过时。工具可以换,底层的理解带不走。

2026-03-18 23:05:00 401

原创 Optional:告别NullPointerException的优雅方案

改变了表达方式:以前:返回null表示没有值,无声无息现在:返回Optional,明确告诉调用者可能没有值改变了处理方式:以前:if(result!= null) 防御性判断,容易遗漏现在:isPresent/orElse/ifPresent 链式处理,语义清晰改变了代码风格:以前:判断逻辑和业务逻辑混在一起现在:用函数式方法处理Optional,可以和流无缝衔接Optional的本质:不是消灭null而是把"可能没有值"这件事从隐式的约定变成显式的类型。

2026-03-12 23:24:22 421

原创 Java 8 流式编程

改变了思维方式:以前:怎么操作数据(命令式)现在:想要什么结果(声明式)改变了代码风格:以前:循环+判断+临时变量,逻辑分散现在:链式调用,逻辑集中,一眼看清意图改变了性能可能性:以前:串行是默认,并行需要大量改造现在:parallel()一行代码,串行变并行流的本质:不是新的数据结构是一种新的处理数据的方式是声明式编程思想在Java中的体现学会用流,不只是学会了一个API,而是学会了一种新的思考和表达问题的方式。

2026-03-12 23:23:49 232

原创 Java函数式编程-lambda表达式

Lambda 的核心思想就是能省的全省1. 参数是什么2. 拿参数做什么// 普通方法:什么都要写// Lambda:只留核心访问修饰符 ← 编译器推断返回值类型 ← 编译器推断方法名 ← 不需要,不会复用参数类型 ← 编译器推断大括号+return ← 单行时省略接口 参数 返回值 方法名Consumer 有 无 accept()Supplier 无 有 get()Function 有 有(任意) apply()Predicate 有 boolean test()

2026-03-12 23:11:15 80

原创 Collections 和 CollectionUtils 详解

方法判空(null安全)❌✅✅Map判空❌❌✅排序✅❌❌交集并集差集❌✅❌过滤转换❌✅❌线程安全包装✅❌❌不可变集合✅❌❌需要额外依赖❌✅✅(Spring项目自带)

2026-03-11 11:23:33 384

原创 Knife4j 文件上传 multipart/data 同时接受文件和对象,调试时上传文件失效

PrizeCreateParam 自定义的java对象 还有 MultipartFile当二者同时使用RequestPart注解后, 按理来说 knife4j页面应该是 可以显示 文件上传和json填写的这里prizePic的请求类型是Query显然是错的,因为文件上传不能在url里面我的knife4j是 4.4.0版本AI的核心修改思路是: 通过 Swagger 注解明确声明每个参数的媒体类型,让 Knife4j 知道「哪个参数是文件、哪个参数是 JSON 对象」,但是AI修改后 主要是 使用P

2026-02-15 21:11:40 408 1

原创 Spring MVC拦截器的快速应用

存储最后一次访问时间的HashMap: {"192.168.1.11": "2025-07-11 00:00:00", "192.168.1.12":"2025-07-10:00:00:00", "192.168.1.13": "2020-01-01 00:00:00"}返回值,哪怕发现 token 无效,也无法阻止请求流程(因为控制器已经执行了),只能做一些 “补救”(比如修改响应体),但核心业务逻辑已经执行,失去了拦截的意义。—— 相当于 “把坏人挡在门外”,而不是 “让坏人进屋里再赶出去”。

2026-02-14 18:32:13 1163 1

原创 JWT Java项目使用

是后端开发最常用的方式。示例:完整配置标准 + 自定义 Claims。

2026-02-14 01:53:47 763

原创 JWT初识

JWT是JSON Web Token的缩写这三个词拆开都是计算机网络中的重要的名词,对于JSON是一种数据格式对于Web是一种架构体系对于Token是一种认证方式把这三者合起来组成了一个新的名词JWT, 他也是一个重要的名词, 是一个开放的标准,HTTP也是一种开放的标准, 像这种开放的标准往往定义了一种宏大的体系或者结构,使得后续各种标准实现或者延伸可以保证规范性。

2026-02-13 23:07:33 599

原创 Docker入门基础知识(二)

默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。Docker容器开机自启 docker update --restart=always [容器名/容器id]其中docker最常见的命令就是 操作镜像,容器的命令,详细见官方文档。查看docker hub,拉取nginx镜像,创建并运行nginx容器。没有指定tag时,默认是latest,代表最新版本的镜像。在DockerHub中搜索nginx镜像,查看镜像的名称。其中repository是镜像名,tag是镜像的版本。

2026-02-04 19:52:17 793

原创 Docker入门基础知识(一)

当我们利用docker安装应用时,docker会自动帮助我们搜索并下载应用镜像(image). 镜像不仅仅包含应用本身,还包含其运行所需要的运行环境,配置以及依赖和函数库等. docker会在运行镜像时创建一个隔离环境,称之为容器(container)先停掉虚拟机中的mysql(如果有安装的前提下),确保本机已经安装了docker,且网络开通正常工作的前提下,执行下面的命令即可安装mysql。所谓的镜像仓库就是存储和管理各种各样的镜像的仓库,docker官方维护了一个公共仓库。

2026-02-04 19:33:10 525

转载 为什么重写equals一定要重写hashcode

由于在 HashMapKey 对象里没有定义 equals 方法,系统就不得不调用 Object 类的 equals 方法,由于 Object 的原生equals方法是根据两个对象的内存地址来判断,而k1和k2是new出来的两个对象具有不同的内存空间,所以 k1 和 k2 一定不会相等,在测试中,新建了两个Student对象,并且让他们的id和name完全一样,在调用equals方法时,返回为true,说明这两个对象是相等的。但 k1 有可能仅仅是和 k2 具有相同的 hash值,但未必和 k2 相等。

2026-01-27 12:38:23 51

原创 软件测试: 从入门到实践(json数据格式)

相信大家只要深入了解过一门面向对象编程语言应该就知道什么是json大多数人脑子里想出来的第一个应该长这样我在做软件测试的时候遇到一个人的测试用例这样写: 我把它简化抽象为一个简单的案例:可以看到这里的json格式和我们心里的第一反应想到的是截然不同的。

2025-12-30 21:15:09 439

原创 软件测试: 从入门到实践(Jmeter的使用)

在接口测试或接口自动化测试中,接口关联将前一个接口返回的数据,作为后一个接口的请求参数或请求头,从而保证业务流程能够正确连续执行。如果不进行接口关联,后续接口往往会因为缺少必要参数或鉴权信息而访问失败。

2025-12-28 11:51:42 1086

原创 软件测试: 从入门到实践(Jmeter的使用)

本属性用于标识一个取样器,建议使用一个有意义的名称。

2025-12-27 23:41:37 786

原创 软件测试: 从入门到实践(接口自动化)

接口自动化测试,是指通过程序化的方式对接口进行调用和验证,模拟不同的请求场景,以确保软件系统内部各个组件之间能够正确地通信并交换数据。相比人工逐个调用接口进行验证,接口自动化可以在短时间内反复执行大量测试用例,从而显著提高测试效率和测试结果的稳定性。接口自动化测试关注的重点在于系统内部的逻辑处理和数据传输是否正确,而不是用户在页面上的操作过程。它直接绕过 UI 层,对后端接口进行验证,因此不会受到页面改版、样式变化或前端交互调整的影响。

2025-12-27 16:31:24 1131

原创 软件测试: 从入门到实践 (接口测试)

说通俗一点,接口测试就是不通过页面操作系统,而是直接和后端接口打交道。在功能测试中,测试人员通常需要打开页面、输入数据、点击按钮,通过前端把数据传递给后端,再观察页面的变化是否符合预期,这个过程中不仅要关注功能是否正确,还要考虑页面展示、前端交互等因素。而接口测试完全跳过了这些步骤,它没有页面,也不关心界面效果。接口测试是根据接口文档中定义的接口地址、请求方式和参数,直接拼接请求报文发送给后端接口,然后检查接口返回的数据是否正确。

2025-12-27 08:59:59 832

原创 软件测试: 从入门到实现(GET/POST请求的区别)

我们通过一道经典面试题来介绍get请求和post请求的区别get请求和post请求的区别?get请求和post请求没有本质上的区别,能用get请求的地方,也能换成post请求反之也能但是在书写使用习惯上存在一定的区别1.get请求通常用来表示"获取数据"语义,post请求通常表示"提交数据"语义2.get请求通常把给服务器传递的数据放到query string请求字符串中,post请求通常方法body请求体中网上关于get请求和post请求的区别众说纷纭也鱼龙混杂需要辨析地去看。

2025-12-27 08:26:57 1014

原创 软件测试:从入门到实践 (认识软件测试)

软件就是的集合软件是计算机的灵魂. 软件又可以分为两大类:和系统软件是生成,准备和执行其他程序所需要的一组文件和程序. 比如 操作系统Windows就是一个软件,数据库MySQL,Oracle等,以及驱动程序(声卡,网卡),Java等编程语言的环境(jvm,node.js).系统软件通常不直接面向普通用户,而是为应用软件的运行提供支撑。应用软件就是为了解决用户的某些具体问题而开发,研制的各种程序或者软件包,比如微信,QQ,Chrome浏览器等.应用软件必须运行在系统软件所提供的环境之上,才能发挥其作用。

2025-12-23 22:41:15 821

原创 ​HTTPS是如何确保安全的

当然是可能的:在零几年的时候有个特别活泼的社区叫乌云网:里面聚集了大量的网络安全学习者,他们的平时任务就是黑服务器找漏洞,当时很多互联网厂商都瑟瑟发抖生怕自家的服务器bug被挖出来造成大量的经济损失,至于他们采用的手段我们不研究,但是可以得出并不存在完全安全的服务,任何服务器都有可能会被攻破。加密的底层逻辑:毋庸置疑一定和数学相关且一定是来源于数论的知识,在这里我们不讨论加密的证明,只讨论加密的使用,因为在计算机开发中,存在相当完备的库供我们使用。如果想要读懂和理解它们的意思,得用第。

2025-10-15 19:21:27 2361 24

原创 Nginx初识到运用

Nginx是一款轻量级的HTTP服务器/反向代理服务器,其特点是占有内存少并发*能力强**,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪网易腾讯淘宝等。特点总结:占用内存小(不到3M C语言开发),并发能力强(5万/秒)nginx体系结构(多进程架构,一个master多个worker)nginx动静分离配置(服务于前后端分离结构)nginx负载均衡配置(轮询,轮询+权重,ip_hash)

2025-10-15 07:45:52 1257 6

原创 java线程池详解

线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们前面学过的线程,这里的任务就是我们前面学过的实现了Runnable或Callable接口的实例对象;CPU密集型:计算为主,线程数 ≈ CPU核数IO密集型:等待为主,线程数 ≈ CPU核数 × 2混合型:根据IO/CPU比例调整https://cloud.tencent.com/developer/article/2092854 【关于美团线程池参数配置的个人实现】

2025-10-14 20:28:16 1023 1

原创 TCP三次握手与四次挥手详解

我们可以清楚的看到TCP报文段其实挺复杂的,有很多字段属性,在此我们先学习其中的六种,这六种就可以帮助我们清楚的学习 大名鼎鼎的 TCP报文三次握手。

2025-10-14 20:27:26 1043 1

原创 每个软件开发人员绝对,肯定必须绝对了解Unicode和字符集

嗯,但是这里有一个问题,就是计算机的字节序有大端和小端的区别,所以这个字符串也完全可以被存成零 x 四八零零,零 x 六五零零,零 x 六 C 零零,零 x 六 C 零零,零 x 六 F 零零。:是的,而且作者还试过另一个商业的库,同样有字符编码的问题。甚至连 PHP 这种,广泛使用的开发工具,对字符编码的支持也很差,默认把字符当成8位来处理,导致很难开发真正的国际化的网站。嗯,比如 A 和 B 肯定是不同的码点,A 和 A 和 A 是同一个码点,但是 A 和 a 又不是同一个码点,这些都是很直观的。

2025-10-09 11:20:11 878

原创 UUID和雪花算法该怎么选择?

Snowflake的算法并不复杂,你在使用的时候可以不考虑独立部署的问题,先想清楚按照自身的业务场景,需要如何设计Snowflake算法中的每一部分占的二进制位数。比如你的业务会部署几个IDC,应用服务器要部署多少台机器,每秒钟发号个数的要求是多少等等,然后在业务代码中实现一个简单的版本先使用,等到应用服务器数量达到一定规模,再考虑独立部署的问题就可以了。这样可以避免多维护一套发号器服务,减少了运维上的复杂度。

2025-10-02 11:15:50 1315 1

原创 IDEA连接redis数据库时出现Failed to connect to any host resolved for DNS name.

本篇的实验版本是RockyLinux8.10版本基于Debian的UbuntuLinux发行版默认防火墙是关闭的,而基于RHEL(CentOS)的RockLinux发行版防火墙默认是开启的,idea连接出现问题很大概率就是这个导致的。

2025-09-11 22:23:50 1476 2

原创 Redis初阶学习

由field和关联的value组成的键值对field和value是字符串类型一个hash中最多包含2^32-1个键值对。

2025-09-03 21:07:25 1069

原创 教会新手小白如何正确查阅JDK官方文档之线程池的使用

从未知到已知,从接口到实现,从抽象到具体。1.如果我们想要查询某个类或者接口,大概率这个类的说明会很麻烦,包含很多无关的知识,而且这个类对于我们来说应该是陌生的。2.查询一个陌生的类或者接口,其实我们可以从它继承或者实现层次比较高的类/接口来当突破口,因为越是层次比较高的类/接口,对应的方法和解释说明会更少一点。

2025-08-27 18:54:07 986

​HTTPS是如何确保安全的

​HTTPS是如何确保安全的

2025-10-15

SSM框架注解大全Xmind

SSM框架注解大全Xmind

2025-07-15

基于算盘模型的进制理解工具,包括16进制8进制2进制10进制等等

解压后点击bintools.bat即可允许

2025-07-09

水流动画演示线程的并行和并发

解压后,点击statr.bat然后,左右按动方向键可以演示不同情况下的并行和并发的效果

2025-07-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除