<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[iov_a的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/iov_a</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; iov_a]]></copyright><item><title><![CDATA[Java IO 流详解：从入门到实战，一文彻底掌握 Java 文件读写]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/163063526</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/163063526</guid><author>iov_a</author><pubDate>Tue, 21 Jul 2026 06:16:45 +0800</pubDate><description><![CDATA[IO（Input / Output）即输入与输出，用于实现程序与外部设备之间的数据交换。这里的“外部设备”包括：磁盘文件键盘输入控制台输出网络连接数据库打印机等读取文件磁盘 ---> 程序对于程序来说：磁盘的数据进入程序，因此属于输入（Input）。程序 ---> 文件程序将数据写入磁盘，因此属于输出（Output）。数据流向程序，就是输入；数据从程序流出，就是输出。Java IO 是 Java 基础中的重要组成部分，也是文件处理和网络编程的基础。理解。]]></description><category></category></item><item><title><![CDATA[Java 文件(File)操作详解，一文掌握 File 类的常见用法]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/163063509</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/163063509</guid><author>iov_a</author><pubDate>Tue, 21 Jul 2026 06:08:35 +0800</pubDate><description><![CDATA[很多初学者第一次接触 File 时，都会认为它代表一个真正的文件。其实并不是。File 类表示的是一个文件或者目录的抽象路径。File 对象仅仅保存了一个路径信息，并不代表这个文件一定存在。这里只是创建了一个 File 对象。并不会创建 demo.txt 文件。如果该路径不存在，也不会报错。只有真正调用创建文件的方法时，磁盘中才会生成对应文件。方法作用exists()判断是否存在创建文件mkdir()创建目录mkdirs()创建多级目录delete()删除isFile()]]></description><category></category></item><item><title><![CDATA[Spring Boot 文件上传详解：深入理解 MultipartFile 的使用与原理]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/163063506</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/163063506</guid><author>iov_a</author><pubDate>Tue, 21 Jul 2026 06:07:40 +0800</pubDate><description><![CDATA[是 Spring MVC 提供的一个接口，用于接收客户端上传的文件。当前端通过上传文件时，浏览器会采用编码格式发送 HTTP 请求，SpringMVC 会自动解析请求，并封装成对象。MultipartFile 本质上就是 SpringMVC 对上传文件的一层封装。开发者无需自己解析 HTTP 请求体，只需要接收即可。Spring 会自动完成以下工作：接收 HTTP 请求解析 multipart/form-data提取上传文件封装成 MultipartFile。]]></description><category></category></item><item><title><![CDATA[Java + Spring Boot 操作 Kafka 完整学习指南]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/161365507</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/161365507</guid><author>iov_a</author><pubDate>Sun, 24 May 2026 15:03:26 +0800</pubDate><description><![CDATA[前置条件：ZooKeeper 集群 + Kafka 集群已启动（3个ZK节点 + 3个Broker） Broker 地址：172.17.0.7:9092, 172.17.0.7:9093, 172.17.0.7:9094。]]></description><category></category></item><item><title><![CDATA[Kafka 零基础实操命令大全]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/161365445</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/161365445</guid><author>iov_a</author><pubDate>Sun, 24 May 2026 15:02:37 +0800</pubDate><description><![CDATA[前面我们吃透了 Kafka的核心底层原理，理论落地必须依靠实操命令。Kafka 日常开发、测试、集群运维的核心操作，全部依赖自带的 shell 命令。本文整理的 Kafka 命令，按「主题管理、消息生产消费、集群运维、分区副本、偏移量查询」分类，搭配详细参数解析、实操场景、避坑说明，新手直接复制即用，完美搭配上篇原理博文，做到。：本文命令基于 Kafka 2.x/3.x 新版本，统一使用（废弃旧版方式），适配所有新版集群。]]></description><category></category></item><item><title><![CDATA[零基础吃透Kafka核心：主题、分区、副本最全实战解析]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/161365347</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/161365347</guid><author>iov_a</author><pubDate>Sun, 24 May 2026 14:51:34 +0800</pubDate><description><![CDATA[Topic（主题）：纯逻辑抽象概念，是业务层面的消息分类、订阅入口。全局唯一、集群共享，元数据存储在Zookeeper中，不属于集群中任何一台Broker节点。生产者发消息、消费者订阅消息，只对接Topic，无需关心底层数据存储。Partition（分区）：Kafka的最小数据存储单元，真实的消息数据都存在分区中。一个Topic可以拆分为多个分区，目的是并行读写、提升集群吞吐量。Replica（副本）：分区的备份数据，为了保证高可用、防止节点宕机数据丢失。副本不属于新分区，只是同一个分区的多份拷贝。误区1。]]></description><category></category></item><item><title><![CDATA[ZooKeeper + Kafka 集群搭建实战记录]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/161365298</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/161365298</guid><author>iov_a</author><pubDate>Sun, 24 May 2026 14:48:54 +0800</pubDate><description><![CDATA[只要看到报错。]]></description><category></category></item><item><title><![CDATA[从零入门 Kafka：Java 原生 API 到 Spring Boot 实战全解析]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/161288210</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/161288210</guid><author>iov_a</author><pubDate>Thu, 21 May 2026 16:02:11 +0800</pubDate><description><![CDATA[Data@Data// 当前累计充电量// 当前累计费用// 电费单价// 服务费单价// 计费规则名称（尖峰平谷）// 充电时长（ms）// 事件时间戳功能原生 API生产消息消费消息+ while 循环注解手动提交序列化手动配置 Serializeryml 配置或@Bean配置类创建 Topic命令行或 AdminClient自动创建死信队列手动捕异常转发重试手动实现选型建议学习和理解底层原理 → 先玩原生 API。]]></description><category></category></item><item><title><![CDATA[Spring Boot WebSocket 两种集成方式深度解析]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/161273060</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/161273060</guid><author>iov_a</author><pubDate>Thu, 21 May 2026 09:50:45 +0800</pubDate><description><![CDATA[WebSocket 是实现服务器主动推送、实时通信的利器，常见于聊天室、消息通知、实时监控大屏等场景。Spring Boot 集成 WebSocket 有两条路把两套配置混用了。两种方式各自的工作原理各自的完整配置步骤最容易踩的坑（以及为什么会踩）选型建议原生Spring配置类Bean+ 实现处理器@Component实现@ComponentBean 注入必须用static字段 + setter 注入直接@Autowired，无限制实例模型每连接一个新实例全局单例互相混用。]]></description><category></category></item><item><title><![CDATA[为什么 MqttConsumer 不交给 Spring 管理？——从一个充电桩项目说起]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/160743919</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/160743919</guid><author>iov_a</author><pubDate>Sun, 03 May 2026 18:36:04 +0800</pubDate><description><![CDATA[1. 并非所有的类都需要交给 Spring 管理。Spring 容器管理的是需要在多处共享、需要享受 Spring 生命周期特性（如依赖注入、AOP、事务等）的对象。像这样的回调类，它的生命周期完全依附于MqttClient，由MqttClient负责持有和调用，不需要被其他地方注入，没有必要进容器。2. 谁创建，谁负责。是在的@Bean方法里创建的，它的生命周期就交给MqttClientBean 来负责。这种"就近创建、就近管理"的原则能有效避免对象归属不清的问题。]]></description><category></category></item><item><title><![CDATA[在 Spring Boot 项目中使用 WebSocket 实现实时通信]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/159383552</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/159383552</guid><author>iov_a</author><pubDate>Mon, 23 Mar 2026 11:17:02 +0800</pubDate><description><![CDATA[1. 引入 spring-boot-starter-websocket 依赖↓2. 注册 ServerEndpointExporter Bean（内置Tomcat必须）↓3. 编写 @ServerEndpoint 端点类实现 @OnOpen / @OnMessage / @OnClose / @OnError↓4. 用 ConcurrentHashMap 管理所有在线 Session↓5. 业务代码调用静态方法主动推送消息↓6. 前端用 new WebSocket(url) 建立连接。]]></description><category></category></item><item><title><![CDATA[Redis GEO，一个被我低估的功能]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/159215459</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/159215459</guid><author>iov_a</author><pubDate>Wed, 18 Mar 2026 23:16:54 +0800</pubDate><description><![CDATA[用 Redis GEO 之前，我觉得地理位置查询是个复杂的事，各种三角函数、坐标系转换，很难搞。真正用起来之后发现，几条命令就能解决大部分场景，难的部分 GeoHash 都替你处理掉了。但了解 GeoHash 的底层原理还是有必要的——知道它是用 ZSet 存的、知道边界问题的存在、知道为什么不能直接操作 score，这些细节在排查问题的时候都有用。另外坐标系那个坑，国内项目一定要提前想好，否则数据都存进去了才发现距离对不上，改起来很麻烦。]]></description><category></category></item><item><title><![CDATA[Canal 过时了？我不这么认为]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/159215292</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/159215292</guid><author>iov_a</author><pubDate>Wed, 18 Mar 2026 23:05:00 +0800</pubDate><description><![CDATA[学一个技术，把它的来龙去脉搞清楚，比只会用它配置更重要。Canal 这个项目，让我真正理解了 MySQL 主从复制协议、binlog 的结构、缓存一致性的几种方案和各自的取舍。这些知识不会因为 Canal 热不热门而过时。工具可以换，底层的理解带不走。]]></description><category></category></item><item><title><![CDATA[Optional：告别NullPointerException的优雅方案]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/158979495</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/158979495</guid><author>iov_a</author><pubDate>Thu, 12 Mar 2026 23:24:22 +0800</pubDate><description><![CDATA[改变了表达方式：以前：返回null表示没有值，无声无息现在：返回Optional，明确告诉调用者可能没有值改变了处理方式：以前：if(result!= null) 防御性判断，容易遗漏现在：isPresent/orElse/ifPresent 链式处理，语义清晰改变了代码风格：以前：判断逻辑和业务逻辑混在一起现在：用函数式方法处理Optional，可以和流无缝衔接Optional的本质：不是消灭null而是把"可能没有值"这件事从隐式的约定变成显式的类型。]]></description><category></category></item><item><title><![CDATA[Java 8 流式编程]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/158979488</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/158979488</guid><author>iov_a</author><pubDate>Thu, 12 Mar 2026 23:23:49 +0800</pubDate><description><![CDATA[改变了思维方式：以前：怎么操作数据（命令式）现在：想要什么结果（声明式）改变了代码风格：以前：循环+判断+临时变量，逻辑分散现在：链式调用，逻辑集中，一眼看清意图改变了性能可能性：以前：串行是默认，并行需要大量改造现在：parallel()一行代码，串行变并行流的本质：不是新的数据结构是一种新的处理数据的方式是声明式编程思想在Java中的体现学会用流，不只是学会了一个API，而是学会了一种新的思考和表达问题的方式。]]></description><category></category></item><item><title><![CDATA[Java函数式编程-lambda表达式]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/158979326</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/158979326</guid><author>iov_a</author><pubDate>Thu, 12 Mar 2026 23:11:15 +0800</pubDate><description><![CDATA[Lambda 的核心思想就是能省的全省1. 参数是什么2. 拿参数做什么// 普通方法：什么都要写// Lambda：只留核心访问修饰符 ← 编译器推断返回值类型 ← 编译器推断方法名 ← 不需要，不会复用参数类型 ← 编译器推断大括号+return ← 单行时省略接口 参数 返回值 方法名Consumer 有 无 accept()Supplier 无 有 get()Function 有 有(任意) apply()Predicate 有 boolean test()]]></description><category></category></item><item><title><![CDATA[Collections 和 CollectionUtils 详解]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/158921661</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/158921661</guid><author>iov_a</author><pubDate>Wed, 11 Mar 2026 11:23:33 +0800</pubDate><description><![CDATA[方法判空（null安全）❌✅✅Map判空❌❌✅排序✅❌❌交集并集差集❌✅❌过滤转换❌✅❌线程安全包装✅❌❌不可变集合✅❌❌需要额外依赖❌✅✅（Spring项目自带）]]></description><category></category></item><item><title><![CDATA[Knife4j 文件上传 multipart/data 同时接受文件和对象，调试时上传文件失效]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/158102145</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/158102145</guid><author>iov_a</author><pubDate>Sun, 15 Feb 2026 21:11:40 +0800</pubDate><description><![CDATA[PrizeCreateParam 自定义的java对象 还有 MultipartFile

当二者同时使用RequestPart注解后, 按理来说 knife4j页面应该是 可以显示 文件上传和json填写的这里prizePic的请求类型是Query显然是错的,因为文件上传不能在url里面我的knife4j是 4.4.0版本


AI的核心修改思路是: 通过 Swagger 注解明确声明每个参数的媒体类型，让 Knife4j 知道「哪个参数是文件、哪个参数是 JSON 对象」,但是AI修改后 主要是 使用P]]></description><category></category></item><item><title><![CDATA[Spring MVC拦截器的快速应用]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/158072337</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/158072337</guid><author>iov_a</author><pubDate>Sat, 14 Feb 2026 18:32:13 +0800</pubDate><description><![CDATA[存储最后一次访问时间的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 无效，也无法阻止请求流程（因为控制器已经执行了），只能做一些 “补救”（比如修改响应体），但核心业务逻辑已经执行，失去了拦截的意义。—— 相当于 “把坏人挡在门外”，而不是 “让坏人进屋里再赶出去”。]]></description><category></category></item><item><title><![CDATA[JWT Java项目使用]]></title><link>https://blog.youkuaiyun.com/iov_a/article/details/158045186</link><guid>https://blog.youkuaiyun.com/iov_a/article/details/158045186</guid><author>iov_a</author><pubDate>Sat, 14 Feb 2026 01:53:47 +0800</pubDate><description><![CDATA[是后端开发最常用的方式。示例：完整配置标准 + 自定义 Claims。]]></description><category></category></item></channel></rss>