IT博文
MySQL 事务隔离级别详解
使用 docker compose 安装 tidb
架构师日记-如何写的一手好代码
生产事故-记一次特殊的OOM排查
Docker安装RabbitMQ——基于docker-compose工具
使用 docker-compose 部署单机 RabbitMQ
只需3步,即刻体验Oracle Database 23c
长达 1.7 万字的 explain 关键字指南!
Redis为什么能抗住10万并发?揭秘性能优越的背后原因
深度剖析Redis九种数据结构实现原理
【绩效季】遇到一个好领导有多重要,从被打差绩效到收获成长
为什么Redis不直接使用C语言的字符串?
Java阻塞队列中的异类,SynchronousQueue底层实现原理剖析
如何调整和优化 Go 程序的内存管理方式?
应用部署引起上游服务抖动问题分析及优化实践方案
Java 并发工具合集 JUC 大爆发!!!
卷起来!!这才是 MySQL 事务 & MVCC 的真相。
JDK8 到 JDK17 有哪些吸引人的新特性?
告别StringUtil:使用Java 11的全新String API优化你的代码
从JDK8飞升到JDK17,再到未来的JDK21
Java JMH Benchmark Tutorial
linux和macOS下top命令区别
Windows10关闭Hyper-V的三种方法
为什么应该选择 POSTGRES?
阿里云对象存储 OSS 限流超过阈值自动关闭【防破产,保平安】
Java高并发革命!JDK19新特性——虚拟线程(Virtual Threads)
“请不要在虚拟机中运行此程序”的解决方案
Spring中的循环依赖及解决
浅谈复杂业务系统的架构设计 | 京东云技术团队
面试题:聊聊TCP的粘包、拆包以及解决方案
操作日志记录实现方式
字节跳动技术团队-慢 SQL 分析与优化
Spring Boot 使用 AOP 防止重复提交
Controller层代码就该这么写,简洁又优雅!
SpringBoot 项目 + JWT 完成用户登录、注册、鉴权
重复提交不再是问题!SpringBoot自定义注解+AOP巧妙解决
SpringBoot 整合 ES 实现 CRUD 操作
SpringBoot 整合 ES 进行各种高级查询搜索
SpringBoot操作ES进行各种高级查询
SpringBoot整合ES查询
如何做架构设计? | 京东云技术团队
最值得推荐的五个VPN软件(便宜+好用+稳定),靠谱的V2ray梯子工具
我说MySQL每张表最好不超过2000万数据,面试官让我回去等通知?
vivo 自研鲁班分布式 ID 服务实践
使用自带zookeeper超简单安装kafka
推荐 6 个很牛的 IDEA 插件
喜马拉雅 Redis 与 Pika 缓存使用军规
「程序员转型技术管理」必修的 10 个能力提升方向
jdk17 下 netty 导致堆内存疯涨原因排查 | 京东云技术团队
如何优雅做好项目管理?
MySQL 到 TiDB:Hive Metastore 横向扩展之路
聊聊即将到来的 MySQL5.7 停服事件
Linux终端环境配置
微软 Edge 浏览器隐藏功能一览:多线程下载、IE 模式、阻止视频自动播放等
Hutool 中那些常用的工具类和实用方法
clash 内核删库?汇总目前常用的内核仓库和客户端
JDK11 升级 JDK17 最全实践干货来了 | 京东云技术团队
我是如何写一篇技术文的?
虚拟线程原理及性能分析
Java线程池实现原理及其在美团业务中的实践
Editplus和EmEditor配置一键编译java运行环境
用Spring Boot 3.2虚拟线程搭建静态文件服务器有多快?
SpringBoot中使用LocalDateTime踩坑记录 - 程序员偏安 - 博客园
程序员必备!10款实用便捷的Git可视化管理工具 - 追逐时光者 - 博客园
基于Netty开发轻量级RPC框架
开发Java应用时如何用好Log
复杂SQL治理实践 | 京东物流技术团队
火山引擎ByteHouse:分析型数据库如何设计并发控制?
多次崩了之后,阿里云终于改了
推荐程序员必知的四大神级学习网站
初探分布式链路追踪
新项目为什么决定用 JDK 17了
Java上进了,JDK21 要来了,并发编程再也不是噩梦了
mapstruct这么用,同事也开始模仿
再见RestTemplate,Spring 6.1新特性:RestClient 了解一下!
【MySQL】MySQL表设计的经验(建议收藏)
如何正确地理解应用架构并开发
解读工行专利CN112905176B
工商银行取得「基于 Spring Boot 的 web 系统后端实现方法及装置」专利
IDEA 2024.1:Spring支持增强、GitHub Action支持增强、更新HTTP Client等
TIOBE 2 月:Go 首次进入前十、“上古语言” COBOL 和 Fortran 排名飙升
Java 21 虚拟线程如何限流控制吞吐量
🎉 通用、灵活、高性能分布式 ID 生成器 | CosId 2.6.6 发布
20年编程,AI编程6个月,关于Copliot辅助编码工具,你想知道的都在这里
Java 8 内存管理原理解析及内存故障排查实践
消息队列选型之 Kafka vs RabbitMQ
从 MongoDB 到 PostgreSQL 的大迁移
腾讯云4月8日故障复盘及情况说明
PHP 在 2024 年还值得学习吗?
AMD集显安装显卡驱动之后出现黑屏,建议这样解决
使用 Docker 部署 moments 微信朋友圈 - 谱次· - 博客园
Java 17 是最常用的 Java LTS 版本
盘点Lombok的几个骚操作
Llama 3 + Ollama + Open WebUI打造本机强大GPT
如何优雅地编写缓存代码
Gmeek快速上手
笔记软件思源远程和本地接入大语言模型服务Ollama实现AI辅助写作(Windows篇)
Git Subtree:简单粗暴的多项目管理神器
这款轻量级规则引擎,真香!!
Ollama教程:本地LLM管理、WebUI对话、Python/Java客户端API应用
GLM-4-9B支持 Ollama 部署
智谱AI开源代码生成大模型第四代版本:CodeGeeX4-ALL-9B
美团二面:如何保证Redis与Mysql双写一致性?连续两个面试问到了!
免费开源好用,Obsidian和Omnivore真正实现一键联动剪藏文章,手把手教程!
得物 Redis 设计与实践
架构图怎么画?手把手教您,以生鲜电商为例剖析业务/应用/数据/技术架构图
使用Hutool要注意了!升级到6.0后你调用的所有方法都将报错 - 掘金
别再用雪花算法生成ID了!试试这个吧
无敌的Arthas!
Navicat Premium v16、v17 破解激活
🎉 分布式接口文档聚合,Solon 是怎么做的?
深入体验全新 Cursor AI IDE 后,说杀疯了真不为过!
Nacos 3.0 架构全景解读,AI 时代服务注册中心的演进
本文档使用 MrDoc 发布
-
+
Hutool 中那些常用的工具类和实用方法
# ❓背景 灵魂拷问 1:还在为新项目工具类搬迁而烦恼? 灵魂拷问 2:还在为项目中工具类维护而烦恼?  # 📘简述 `**Hutool**`它是一个 Java 工具集类库,包含了很多静态方法的封装:流处理、时间日期处理、正则处理、加解密处理、文件处理、集合处理等,可以说是项目中几乎所有 XxxxUtil 的替代品,它可以使你更多的关注代码逻辑,优雅的写出高效代码,避免 “复制粘贴,改改再战”。 # ”🛠️组件 模块划分预览,可以根据需求对每个模块单独引入,也可以通过引入`hutool-all`方式引入所有模块。 | 模块 | 介绍 | | --- | --- | | hutool-aop | JDK 动态代理封装,提供非 IOC 下的切面支持 | | hutool-bloomFilter | 布隆过滤,提供一些 Hash 算法的布隆过滤 | | hutool-cache | 简单缓存实现 | | **hutool-core** | **核心,包括 Bean 操作、日期、各种 Util 等** | | hutool-cron | 定时任务模块,提供类 Crontab 表达式的定时任务 | | **hutool-crypto** | **加密解密模块,提供对称、非对称和摘要算法封装** | | hutool-db | JDBC 封装后的数据操作,基于 ActiveRecord 思想 | | hutool-dfa | 基于 DFA 模型的多关键字查找 | | hutool-extra | 扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等) | | **hutool-http** | **基于 HttpUrlConnection 的 Http 客户端封装** | | hutool-log | 自动识别日志实现的日志门面 | | hutool-script | 脚本执行封装,例如 Javascript | | hutool-setting | 功能更强大的 Setting 配置文件和 Properties 封装 | | hutool-system | 系统参数调用封装(JVM 信息等) | | hutool-json | JSON 实现 | | hutool-captcha | 图片验证码实现 | | hutool-poi | 针对 POI 中 Excel 和 Word 的封装 | | hutool-socket | 基于 Java 的 NIO 和 AIO 的 Socket 封装 | | hutool-jwt | JSON Web Token (JWT) 封装实现 | # ☀️常用 ⚠️**只列举部分方法,详细可查看源码学习!!!** ## 1、核心工具集 ### 1.1、日期时间工具 - DateUtil > 日期转换再常用不过了,字符串转日期格式、日期格式转指定字符串格式、获取当前系统日期、时间差 ``` // 自定义日期格式转化 String dateStr = "2017-03-01"; Date date = DateUtil.parse(dateStr, "yyyy-MM-dd"); ``` ### 1.2、农历日期 - ChineseDate > 提供了生肖、天干地支、传统节日等方法。 ``` //通过公历构建 ChineseDate date = new ChineseDate(DateUtil.parseDate("2020-01-25")); // 一月 date.getChineseMonth(); // 正月 date.getChineseMonthName(); // 初一 date.getChineseDay(); // 庚子 date.getCyclical(); // 生肖:鼠 date.getChineseZodiac(); // 传统节日(部分支持,逗号分隔):春节 date.getFestivals(); // 庚子鼠年 正月初一 date.toString(); ``` ### 1.3、计时器工具 - TimeInterval > 计算方法或过程执行的时间,支持分组计时,方便对比时间 ``` TimeInterval timer = DateUtil.timer(); //--------------------------------- //-------这是执行过程 //--------------------------------- timer.interval();//花费毫秒数 timer.intervalRestart();//返回花费时间,并重置开始时间 timer.intervalMinute();//花费分钟数 ``` ### 1.4、文件类型判断 - FileTypeUtil > 在文件上传时,有时候我们需要判断文件类型。但是又不能简单的通过扩展名来判断(防止恶意脚本等通过上传到服务器上),于是我们需要在服务端通过读取文件的首部几个二进制位来判断常用的文件类型。 ``` File file = FileUtil.file("d:/test.jpg"); String type = FileTypeUtil.getType(file); //输出 jpg则说明确实为jpg文件 Console.log(type); ``` ### 1.5、符串工具 - StrUtil > 这个工具的用处类似于 [Apache Commons Lang](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fcommons.apache.org%2F) 中的 StringUtil,字符串判空操作就不再累述,StrUtil 只做增强:sub、removePrefix、removeSuffix ``` // 去掉字符串的后缀,例如去个文件名的扩展名。 String fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg") //fileName -> pretty_girl ``` ### 1.6、16 进制工具 - HexUtil > 16 进制一般针对无法显示的一些二进制进行显示,常用于: 1、图片的字符串表现形式 2、加密解密 3、编码转换 ``` String str = "我是一个字符串"; String hex = HexUtil.encodeHexStr(str, CharsetUtil.CHARSET_UTF_8); //hex是: //e68891e698afe4b880e4b8aae5ad97e7aca6e4b8b2 String decodedStr = HexUtil.decodeHexStr(hex); //解码后与str相同 ``` ### 1.7、Escape 工具 - EscapeUtil > 转义和反转义工具类 Escape / Unescape。escape 采用 ISO Latin 字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非 ASCII 字符都将被转化成 % xx 格式的字符编码 (xx 等于该字符在字符集表里面的编码的 16 进制数字)。此类中的方法对应 Javascript 中的 `escape()` 函数和 `unescape()` 函数。  ### 1.8、URL 工具 - URLUtil > URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址。表示为互联网上的资源,如网页或者 FTP 地址。在 Java 中,也可以使用 URL 表示 Classpath 中的资源(Resource)地址。 • `URLUtil.normalize` 标准化化 URL 链接。对于不带 http:// 头的地址做简单补全。 ``` String url = "http://www.hutool.cn//aaa/bbb"; // 结果为:http://www.hutool.cn/aaa/bbb String normalize = URLUtil.normalize(url); url = "http://www.hutool.cn//aaa/\\bbb?a=1&b=2"; // 结果为:http://www.hutool.cn/aaa/bbb?a=1&b=2 normalize = URLUtil.normalize(url); ``` • `URLUtil.encode` 封装`URLEncoder.encode`,将需要转换的内容(ASCII 码形式之外的内容),用十六进制表示法转换出来,并在之前加上 % 开头。 ``` String body = "366466 - 副本.jpg"; // 结果为:366466%20-%20%E5%89%AF%E6%9C%AC.jpg String encode = URLUtil.encode(body); ``` ### 1.9、枚举工具 - EnumUtil > 枚举(enum)算一种 “语法糖”,是指一个经过排序的、被打包成一个单一实体的项列表。一个枚举的实例可以使用枚举项列表中任意单一项的值。枚举在各个语言当中都有着广泛的应用,通常用来表示诸如颜色、方式、类别、状态等等数目有限、形式离散、表达又极为明确的量。Java 从 JDK5 开始,引入了对枚举的支持。 ``` //定义枚举 public enum TestEnum{ TEST1("type1"), TEST2("type2"), TEST3("type3"); private TestEnum(String type) { this.type = type; } private String type; public String getType() { return this.type; } } // 获取枚举类中所有枚举对象的name列表 List<String> names = EnumUtil.getNames(TestEnum.class); //结果:[TEST1, TEST2, TEST3] // 获得枚举类中各枚举对象下指定字段的值 List<Object> types = EnumUtil.getFieldValues(TestEnum.class, "type"); //结果:[type1, type2, type3] ``` ### 1.10、数字工具 - NumberUtil > 数字工具针对数学运算做工具性封装 ``` // 格式化为指定字符串 long c = 299792458;//光速 String format = NumberUtil.decimalFormat(",###", c);//299,792,458 ``` ### 1.11、数组工具 - ArrayUtil > 数组工具类主要针对原始类型数组和泛型数组相关方案进行封装 ``` // 数组判空 int[] a = {}; int[] b = null; ArrayUtil.isEmpty(a); ArrayUtil.isEmpty(b); ``` ### 1.12、随机工具 - RandomUtil > RandomUtil 主要针对 JDK 中 Random 对象做封装,严格来说,Java 产生的随机数都是伪随机数,因此 Hutool 封装后产生的随机结果也是伪随机结果。不过这种随机结果对于大多数情况已经够用。 ``` // 例如我们想产生一个[10, 100)的随机数,则: int c = RandomUtil.randomInt(10, 100); ``` ### 1.13、唯一 ID 工具 - IdUtil > 在分布式环境中,唯一 ID 生成应用十分广泛,生成方法也多种多样,Hutool 针对一些常用生成策略做了简单封装。包括 `**UUID**` 、 `**ObjectId(MongoDB)**` 、 `**Snowflake(Twitter)**` ``` // 生成的UUID是带-的字符串,类似于:a5c8a5e8-df2b-4706-bea4-08d0939410e3 String uuid = IdUtil.randomUUID(); // 生成的是不带-的字符串,类似于:b17f24ff026d40949c85a24f4f375d42 String simpleUUID = IdUtil.simpleUUID(); ``` ### 1.14、正则工具 - ReUtil > 在文本处理中,正则表达式几乎是全能的,但是 Java 的正则表达式有时候处理一些事情还是有些繁琐 ``` // 给定字符串是否匹配给定正则 String content = "ZZZaaabbbccc中文1234"; boolean isMatch = ReUtil.isMatch("\\w+[\u4E00-\u9FFF]+\\d+", content); Assert.assertTrue(isMatch); ``` ### 1.15、身份证工具 - IdcardUtil > 支持大陆 15 位、18 位身份证,港澳台 10 位身份证 ``` String ID_18 = "321083197812162119"; String ID_15 = "150102880730303"; //是否有效 boolean valid = IdcardUtil.isValidCard(ID_18); boolean valid15 = IdcardUtil.isValidCard(ID_15); //转换 String convert15To18 = IdcardUtil.convert15To18(ID_15); //年龄 DateTime date = DateUtil.parse("2017-04-10"); int age = IdcardUtil.getAgeByIdCard(ID_18, date); int age2 = IdcardUtil.getAgeByIdCard(ID_15, date); //生日 String birth = IdcardUtil.getBirthByIdCard(ID_18); String birth2 = IdcardUtil.getBirthByIdCard(ID_15); //省份 String province = IdcardUtil.getProvinceByIdCard(ID_18); String province2 = IdcardUtil.getProvinceByIdCard(ID_15); ``` ### 1.16、信息脱敏工具 - DesensitizedUtil > 在数据处理或清洗中,可能涉及到很多隐私信息的脱敏工作,因此 Hutool 针对常用的信息封装了一些脱敏方法。 ``` // 以身份证号码为例:5***************1X DesensitizedUtil.idCardNum("51343620000320711X", 1, 2); ``` ### 1.17、社会信用代码工具 - CreditCodeUtil > 法人和其他组织统一社会信用代码制度,相当于让法人和其他组织拥有了一个全国统一的 “身份证号”,由一下五部分组成: 第一部分:登记管理部门代码 1 位 (数字或大写英文字母) 第二部分:机构类别代码 1 位 (数字或大写英文字母) 第三部分:登记管理机关行政区划码 6 位 (数字) 第四部分:主体标识码(组织机构代码)9 位 (数字或大写英文字母) 第五部分:校验码 1 位 (数字或大写英文字母) ``` // 校验是否为社会信用代码 String testCreditCode = "91310110666007217T"; // true CreditCodeUtil.isCreditCode(testCreditCode); ``` ### 1.18、字段验证器 - Validator > 验证给定字符串是否满足指定条件,一般用在表单字段验证里。 ``` // 验证是否为邮箱 boolean isEmail = Validator.isEmail("loolly@gmail.com") // 如无法满足需求,可通过该正则验证 Validator.isMactchRegex("需要验证字段的正则表达式", "被验证内容") ``` ### 1.19、Bean 工具 - BeanUtil > Bean 工具类主要是针对这些 setXXX 和 getXXX 方法进行操作,比如将 Bean 对象转为 Map 等等 ``` // 使用Map填充bean HashMap<String, Object> map = CollUtil.newHashMap(); map.put("name", "Joe"); map.put("age", 12); map.put("openId", "DFDFSDFWERWER"); SubPerson person = BeanUtil.fillBeanWithMap(map, new SubPerson(), false); ``` ### 1.20、集合工具 - CollUtil > 这个工具主要增加了对数组、集合类的操作。 ``` // 将集合转换为字符串 String[] col= new String[]{"a","b","c","d","e"}; List<String> colList = CollUtil.newArrayList(col); String str = CollUtil.join(colList, "#"); //str -> a#b#c#d#e ``` ### 1.21、列表工具 - ListUtil > `**List**` 在集合中中使用最为频繁,因此新版本的 Hutool 中针对 List 单独封装了工具方法。 ``` // 列表截取 final List<Integer> of = ListUtil.of(1, 2, 3, 4); // [3, 4] final List<Integer> sub = ListUtil.sub(of, 2, 4); // 对子列表操作不影响原列表 sub.remove(0); ``` ### 1.22、Unicode 编码转换工具 - UnicodeUtil > 此工具主要针对类似于 \\\\u4e2d\\\\u6587 这类 Unicode 字符做一些特殊转换。 ``` // 字符串转Unicode 第二个参数true表示跳过ASCII字符(只跳过可见字符) String s = UnicodeUtil.toUnicode("aaa123中文", true); //结果aaa123\\u4e2d\\u6587 // Unicode转字符串 String res = UnicodeUtil.toString("aaa\\U4e2d\\u6587\\u111\\urtyu\\u0026"); //结果aaa中文\\u111\\urtyu& ``` ### 1.23、Map 工具 - MapUtil > MapUtil 是针对 Map 的一一列工具方法的封装,包括 getXXX 的快捷值转换方法。 ``` // reverse Map的键和值互换 Map<String, String> map = MapUtil.newHashMap(); map.put("a", "1"); map.put("b", "2"); map.put("c", "3"); map.put("d", "4"); Map<String, String> map2 = MapUtil.reverse(map); ``` 结果为: ``` { "1": "a", "2": "b", "3": "c", "4": "d", } ``` ### 1.24、Base64 编码解码 > Base64 编码是用 64(2 的 6 次方)个 ASCII 字符来表示 256(2 的 8 次方)个 ASCII 字符,也就是三位二进制数组经过编码后变为四位的 ASCII 字符显示,长度比原来增加 1/3。 ``` String a = "伦家是一个非常长的字符串"; // 5Lym5a625piv5LiA5Liq6Z2e5bi46ZW/55qE5a2X56ym5Liy String encode = Base64.encode(a); // 还原为a String decodeStr = Base64.decodeStr(encode); ``` ### 1.25、数学相关 - MathUtil > 此工具是 NumberUtil 的一个补充,NumberUtil 偏向于简单数学计算的封装,MathUtil 偏向复杂数学计算。  ### 1.26、图片工具 - ImgUtil > 针对 awt 中图片处理进行封装,这些封装包括:缩放、裁剪、转为黑白、加水印等操作。 ``` // 图片类型转换png->jpg ImgUtil.convert(FileUtil.file("e:/test2.png"), FileUtil.file("e:/test2Convert.jpg")); // 彩色转黑白 ImgUtil.gray(FileUtil.file("d:/logo.png"), FileUtil.file("d:/result.png")); // 添加文字水印 ImgUtil.pressText( FileUtil.file("e:/pic/face.jpg"), FileUtil.file("e:/pic/test2_result.png"), "版权所有", Color.WHITE, //文字 new Font("黑体", Font.BOLD, 100), //字体 0, //x坐标修正值。 默认在中间,偏移量相对于中间偏移 0, //y坐标修正值。 默认在中间,偏移量相对于中间偏移 0.8f//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字 ); ``` ### 1.27、网络工具 - NetUtil > 在日常开发中,网络连接这块儿必不可少。日常用到的一些功能,隐藏掉部分 IP 地址、绝对相对路径的转换等等。 ``` String ip= "127.0.0.1"; long iplong = 2130706433L; // 根据long值获取ip v4地址 String ip= NetUtil.longToIpv4(iplong); // 根据ip地址计算出long型的数据 long ip= NetUtil.ipv4ToLong(ip); // 检测本地端口可用性 boolean result= NetUtil.isUsableLocalPort(6379); // 是否为有效的端口 boolean result= NetUtil.isValidPort(6379); // 隐藏掉IP地址 String result =NetUtil.hideIpPart(ip); ``` ## 2、JSON ### 2.1、JSON 工具 - JSONUtil > 针对 JSONObject 和 JSONArray 的静态快捷方法集合 ``` // JSON字符串解析 String html = "{\"name\":\"Something must have been changed since you leave\"}"; JSONObject jsonObject = JSONUtil.parseObj(html); jsonObject.getStr("name"); // XML字符串转JSON String s = "<sfzh>123</sfzh><sfz>456</sfz><name>aa</name><gender>1</gender>"; JSONObject json = JSONUtil.parseFromXml(s); json.get("sfzh"); json.get("name"); // JSON转XML final JSONObject put = JSONUtil.createObj().set("aaa", "你好").set("键2", "test"); // <aaa>你好</aaa><键2>test</键2> final String s = JSONUtil.toXmlStr(put); // JSON转Bean String json = "{\"ADT\":[[{\"BookingCode\":[\"N\",\"N\"]}]]}"; Price price = JSONUtil.toBean(json, Price.class); price.getADT().get(0).get(0).getBookingCode().get(0); ``` ## 3、加密解密 ### 3.1、加密解密工具 - SecureUtil > SecureUtil 主要针对常用加密算法构建快捷方式,还有提供一些密钥生成的快捷工具方法。 ``` // AES对称加解密 String content = "test中文"; // 随机生成密钥 byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded(); // 构建 AES aes = SecureUtil.aes(key); // 加密 byte[] encrypt = aes.encrypt(content); // 解密 byte[] decrypt = aes.decrypt(encrypt); // 加密为16进制表示 String encryptHex = aes.encryptHex(content); // 解密为字符串 String decryptStr = aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8); ``` ## 4、HTTP 客户端 ### 4.1、Http 客户端工具类 - HttpUtil > 基于 JDK 的 HttpUrlConnection 封装完成,完整支持 https、代理和文件上传、以及 URL 参数编解码等。 GET 请求栗子: ``` // 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS String result1= HttpUtil.get("https://www.baidu.com"); // 当无法识别页面编码的时候,可以自定义请求页面的编码 String result2= HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8); //可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中 HashMap<String, Object> paramMap = new HashMap<>(); paramMap.put("city", "北京"); String result3= HttpUtil.get("https://www.baidu.com", paramMap); ``` POST 请求栗子: ``` HashMap<String, Object> paramMap = new HashMap<>(); paramMap.put("city", "北京"); String result= HttpUtil.post("https://www.baidu.com", paramMap); ``` 文件上传栗子: ``` HashMap<String, Object> paramMap = new HashMap<>(); //文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别 paramMap.put("file", FileUtil.file("D:\\face.jpg")); String result= HttpUtil.post("https://www.baidu.com", paramMap); ``` ### 4.2、HTML 工具类 - HtmlUtil > 如我们在使用爬虫爬取 HTML 页面后,需要对返回页面的 HTML 内容做一定处理,比如去掉指定标签(例如广告栏等)、去除 JS、去掉样式等等,这些操作都可以使用 **HtmlUtil** 完成。 ``` // 转义HTML特殊字符 String html = "<html><body>123'123'</body></html>"; // 结果为:<html><body>123'123'</body></html> String escape = HtmlUtil.escape(html); // 还原被转义的HTML特殊字符 String escape = "<html><body>123'123'</body></html>"; // 结果为:<html><body>123'123'</body></html> String unescape = HtmlUtil.unescape(escape); // 清除指定HTML标签和被标签包围的内容 String str = "pre<img src=\"xxx/dfdsfds/test.jpg\">"; // 结果为:pre String result = HtmlUtil.removeHtmlTag(str, "img"); // 清除所有HTML标签,但是保留标签内的内容 String str = "pre<div class=\"test_div\">\r\n\t\tdfdsfdsfdsf\r\n</div><div class=\"test_div\">BBBB</div>"; // 结果为:pre\r\n\t\tdfdsfdsfdsf\r\nBBBB String result = HtmlUtil.cleanHtmlTag(str); // 清除指定HTML标签,不包括内容 String str = "pre<div class=\"test_div\">abc</div>"; // 结果为:preabc String result = HtmlUtil.unwrapHtmlTag(str, "div"); // 过滤HTML文本,防止XSS攻击 String html = "<alert></alert>"; // 结果为:"" String filter = HtmlUtil.filter(html); ``` ## 5、扩展工具集 ### 5.1、拼音工具 - PinyinUtil > 引入拼音库(TinyPinyin、JPinyin、Pinyin4j)其中任意一个引擎,从而实现获取汉语拼音、拼音首字母 ``` // 获取拼音:"ni hao" String pinyin = PinyinUtil.getPinyin("你好", " "); // 获取拼音首字母:"h, s, d, y, g" String result = PinyinUtil.getFirstLetter("H是第一个", ", "); ``` ### 5.2、Emoji 工具 - EmojiUtil > 引入表情依赖,实现表情转义、表情转 html、转义的别名转表情 ``` <!-- 表情依赖 --> <dependency> <groupId>com.vdurmont</groupId> <artifactId>emoji-java</artifactId> <version>4.0.0</version> </dependency> ``` ``` // 转义Emoji字符 String alias = EmojiUtil.toAlias("😄");//:smile: // 将转义的别名转为Emoji字符 String emoji = EmojiUtil.toUnicode(":smile:");//😄 // 将字符串中的Unicode Emoji字符转换为HTML表现形式 String alias = EmojiUtil.toHtml("😄");//👦 ``` ### 5.3、二维码工具 - QrCodeUtil > 引入 zxing 库依赖(理论上你引入的版本应与此版本一致或比这个版本新),实现二维码的生成(二维码可附带 logo 图标)以及识别二维码 ``` <!-- zxing库依赖 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.3</version> </dependency> ``` ``` // 自定义参数生成指定url对应的二维码到文件 QrConfig config = new QrConfig(300, 300); // 设置边距,既二维码和背景之间的边距 config.setMargin(3); // 设置前景色,既二维码颜色(青色) config.setForeColor(Color.CYAN.getRGB()); // 设置背景色(灰色) config.setBackColor(Color.GRAY.getRGB()); // 生成二维码到文件,也可以到流 QrCodeUtil.generate("http://hutool.cn/", config, FileUtil.file("e:/qrcode.jpg")); // 识别二维码(decode -> "http://hutool.cn/" ) String decode = QrCodeUtil.decode(FileUtil.file("d:/qrcode.jpg")); ``` ### 5.4、邮件工具 - MailUtil > Hutool 对所有第三方都是可选依赖,因此在使用 MailUtil 时需要自行引入第三方依赖。支持群发、带附件、自定义邮件服务器 ``` <!-- java-mail依赖 --> <!-- 说明 com.sun.mail是javax.mail升级后的版本,新版本包名做了变更。 --> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> ``` ``` // 发送普通文本邮件,最后一个参数可选是否添加多个附件 MailUtil.send("hutool@foxmail.com", "测试", "邮件来自Hutool测试", false); // 发送HTML格式的邮件并附带附件,最后一个参数可选是否添加多个附件: MailUtil.send("hutool@foxmail.com", "测试", "<h1>邮件来自Hutool测试</h1>", true, FileUtil.file("d:/aaa.xml")); // 群发邮件,可选HTML或普通文本,可选多个附件: ArrayList<String> tos = CollUtil.newArrayList( "person1@bbb.com", "person2@bbb.com", "person3@bbb.com", "person4@bbb.com"); MailUtil.send(tos, "测试", "邮件来自Hutool群发测试", false); ``` > 官方文档: https://www.hutool.cn/docs/#/ > > Github 地址: https://github.com/dromara/hutool > > Gitee 地址: https://gitee.com/dromara/hutool
admin
2023年10月29日 07:40
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码