Hutool实战指南:如何用Java工具库提升开发效率

news2026/4/14 18:51:23
1. Hutool工具库简介Hutool是一个小而全的Java工具类库它通过静态方法封装降低了相关API的学习成本提高了工作效率。这个工具库让Java也能像脚本语言一样甜甜的。Hutool中的工具方法来自于每个用户的精雕细琢它涵盖了Java开发底层代码中的方方面面它既是大型项目开发中解决小问题的利器也是小型项目中的效率担当。Hutool是项目中util包友好的替代它节省了开发人员对项目中公用类和公用工具方法的封装时间使开发专注于业务同时可以最大程度地避免封装不完善带来的bug。Hutool Hu tool是原公司项目底层代码剥离后的开源库Hu是公司名称的表示tool表示工具。Hutool谐音糊涂一方面简单易懂一方面寓意难得糊涂。Hutool的目标是使用一个工具方法代替一段复杂代码从而最大程度地避免复制粘贴代码的问题彻底改变我们写代码的方式。以计算MD5为例以前打开搜索引擎 - 搜Java MD5加密 - 打开某篇博客 - 复制粘贴 - 改改好用现在引入Hutool - SecureUtil.md5()Hutool的存在就是为了减少代码搜索成本避免网络上参差不齐的代码出现导致的bug。2. Hutool核心组件介绍2.1 基础工具类Hutool提供了一系列基础工具类包括文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装组成各种Util工具类同时提供以下组件hutool-aopJDK动态代理封装提供类似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脚本执行封装例如JavaScripthutool-setting功能更强大的Setting配置文件和Properties封装hutool-system系统参数调用封装JVM信息等hutool-jsonJSON实现hutool-captcha图片验证码实现hutool-poi针对POI中Excel和Word的封装hutool-socket基于Java的NIO和AIO的Socket封装hutool-jwtJSON Web Token (JWT)封装实现2.2 官方文档与引入方式Hutool的官方文档非常全面包括官网Hutool — A set of tools that keep Java sweet.参考文档简介 | HutoolAPI文档Document引入Hutool非常简单直接在项目中引入如下依赖即可dependency groupIdcn.hutool/groupId artifactIdhutool-all/artifactId version5.8.0/version /dependency3. 常用工具类实战3.1 Convert类型转换工具在Java开发中我们经常要面对各种各样的类型转换问题尤其是从命令行获取的用户参数、从HttpRequest获取的Parameter等等这些参数类型多种多样我们怎么去转换它们呢常用的做法是先整成String然后调用XXX.parseXXX方法还要承受转换失败的风险不得不加一层try catch这个小小的过程混杂在业务代码中会显得非常难看和臃肿。Convert类可以说是工具方法类里面封装了针对Java常见类型的转换用于简化类型转换。Convert类中大部分方法为toXXX参数为Object可以实现将任何可能的类型转换为指定类型。同时支持第二个参数defaultValue用于在转换失败时返回一个默认值。import cn.hutool.core.convert.Convert; import lombok.extern.slf4j.Slf4j; import java.util.Date; import java.util.List; Slf4j public class ConvertDemo { public void covert() { //转换为字符串 int a 1; String aStr Convert.toStr(a); log.info(aStr); //转换为指定类型数组 String[] b {1, 2, 3, 4}; Integer[] bArr Convert.toIntArray(b); log.info(Arrays.toString(bArr)); //转换为日期对象 String dateStr 2023-09-17; Date date Convert.toDate(dateStr); log.info(date.toString()); //转换为列表 String[] strArr {a, b, c, d}; ListString strList Convert.toList(String.class, strArr); log.info(strList.toString()); } }3.2 DateUtil日期时间工具日期时间工具类定义了一些常用的日期时间操作方法。public void dateUtil() { //Date、long、Calendar之间的相互转换 //当前时间 Date date DateUtil.date(); log.info(date.toString()); //Calendar转Date date DateUtil.date(Calendar.getInstance()); //时间戳转Date date DateUtil.date(System.currentTimeMillis()); //自动识别格式转换 String dateStr 2023-09-17; date DateUtil.parse(dateStr); //自定义格式化转换 date DateUtil.parse(dateStr, yyyy-MM-dd); //格式化输出日期 String format DateUtil.format(date, yyyy-MM-dd); log.info(format); //获取年的部分 int year DateUtil.year(date); //获取月份从0开始计数 int month DateUtil.month(date); //获取某天的开始、结束时间 Date beginOfDay DateUtil.beginOfDay(date); Date endOfDay DateUtil.endOfDay(date); //计算偏移后的日期时间 Date newDate DateUtil.offset(date, DateField.DAY_OF_MONTH, 2); //计算日期时间之间的偏移量 long betweenDay DateUtil.between(date, newDate, DateUnit.DAY); }3.3 ReflectUtil反射工具Java反射工具类可用于反射获取类的方法及创建对象。public void reflectUtil() { //获取某个类的所有方法 Method[] methods ReflectUtil.getMethods(Dog.class); //获取某个类的指定方法 Method method ReflectUtil.getMethod(Dog.class, getName); //使用反射来创建对象 Dog dog ReflectUtil.newInstance(Dog.class); //反射执行对象的方法 ReflectUtil.invoke(dog, setName,大黄); log.info(dog.getName()); } Data Builder NoArgsConstructor AllArgsConstructor public class Dog { private String name; private Float weight; }3.4 NumberUtil数字处理工具public void numberUtil() { double n1 1.234; double n2 1.234; double result; //对float、double、BigDecimal做加减乘除操作 result NumberUtil.add(n1, n2); log.info(String.valueOf(result)); result NumberUtil.sub(n1, n2); log.info(String.valueOf(result)); result NumberUtil.mul(n1, n2); log.info(String.valueOf(result)); result NumberUtil.div(n1, n2); log.info(String.valueOf(result)); //保留两位小数 BigDecimal roundNum NumberUtil.round(n1, 2); log.info(roundNum.toString()); String n3 1.234; //判断是否为数字、整数、浮点数 NumberUtil.isNumber(n3); NumberUtil.isInteger(n3); NumberUtil.isDouble(n3); }3.5 CollUtil集合操作工具集合操作的工具类定义了一些常用的集合操作。public void collUtil() { //数组转换为列表 String[] array new String[]{a, b, c, d, e}; ListString list CollUtil.newArrayList(array); //join数组转字符串时添加连接符 String joinStr CollUtil.join(list, ,); log.info(collUtil join:{}, joinStr); //将以连接符分隔的字符串再转换为列表 ListString splitList StrUtil.split(joinStr, ,); log.info(collUtil split:{}, splitList); //创建新的Map、Set、List HashMapObject, Object newMap CollUtil.newHashMap(); HashSetObject newHashSet CollUtil.newHashSet(); ArrayListObject newList CollUtil.newArrayList(); //判断列表是否为空 CollUtil.isEmpty(list); CollUtil.isNotEmpty(list); }3.6 SecureUtil加密解密工具public void secureUtil() { // 加密 String str 123456; String key secretKey; byte[] keyBytes Arrays.copyOf(key.getBytes(), 16); String encryptedStr SecureUtil.aes(keyBytes).encryptBase64(str); log.info(Encrypted string: {}, encryptedStr); // 解密 String decryptedStr SecureUtil.aes(keyBytes).decryptStr(encryptedStr); log.info(Decrypted string: {}, decryptedStr); }3.7 JSONUtil JSON处理工具JSON解析工具类针对JSONObject和JSONArray的快捷方法集合。public void jsonUtil() { Dog dog new Dog(); dog.setName(大黄); dog.setWeight(5.14f); //对象转化为JSON字符串 String jsonStr JSONUtil.parse(dog).toString(); log.info(jsonUtil parse:{}, jsonStr); //JSON字符串转化为对象 Dog dogBean JSONUtil.toBean(jsonStr, Dog.class); log.info(jsonUtil toBean:{}, dogBean); ListDog dogList new ArrayList(); dogList.add(dog); String jsonListStr JSONUtil.parse(dogList).toString(); //JSON字符串转化为列表 dogList JSONUtil.toList(new JSONArray(jsonListStr), Dog.class); log.info(jsonUtil toList:{}, dogList); }3.8 RandomUtil随机工具随机工具类RandomUtil主要针对JDK中的Random对象做封装。Test(description RandomUtil使用随机工具类) public void randomUtil() { int result; String uuid; //获得指定范围内的随机数 result RandomUtil.randomInt(1, 100); log.info(randomInt:{},StrUtil.toString(result)); //获得随机UUID uuid RandomUtil.randomUUID(); log.info(randomUUID:{}, uuid); }4. 实战Excel开发4.1 数据库表设计首先我们设计一个数据库表来存储用户信息CREATE TABLE cf_group_user ( id INT UNSIGNED AUTO_INCREMENT COMMENT id PRIMARY KEY, group_id INT UNSIGNED NOT NULL COMMENT 组织id, nickname CHAR(30) NOT NULL COMMENT 姓名, sex TINYINT UNSIGNED NOT NULL COMMENT 性别(1:男2:女), born_time DATETIME NOT NULL COMMENT 出生日期, photo VARCHAR(255) NOT NULL COMMENT 形象照片, home_address VARCHAR(255) NOT NULL COMMENT 家庭地址, mobile INT NOT NULL COMMENT 联系电话, post VARCHAR(255) NOT NULL COMMENT 职务信息 ) COMMENT 组织用户信息表 COLLATE utf8_unicode_ci; CREATE INDEX auth_id ON cf_group_user (auth_id); CREATE INDEX group_id ON cf_group_user (group_id); CREATE INDEX mobile ON cf_group_user (mobile);4.2 实体类设计对应的Java实体类如下/** * 组织用户信息表 * TableName cf_group_user */ TableName(value cf_group_user) Data public class GroupUser implements Serializable { /** * id */ TableId(type IdType.AUTO) private Integer id; /** * 组织id */ private Integer groupId; /** * 姓名 */ NotBlank(message 姓名不可为空) private String nickname; /** * 性别(0:默认1:男2:女) */ NotBlank(message 性别不可为空) private Integer sex; /** * 出生日期 */ NotBlank(message 出生日期不可为空) private Date bornTime; /** * 形象照片 */ NotBlank(message 形象照片不可为空) private String photo; /** * 家庭地址 */ NotBlank(message 家庭地址不可为空) private String homeAddress; /** * 联系电话 */ NotBlank(message 联系电话不可为空) private Integer mobile; /** * 认证信息 */ private String authId; /** * 职务信息 */ NotNull(message 职务不可为空) private String post; }4.3 Excel模板导出在工程中先确定使用的字段构建模板根据字段构建excel的模板。这里的示例如下//controller层 //返回模板 RequestMapping(/getExcelTemplate) public void getExcelTemplate(HttpServletResponse response) { groupUserService.getExcelTemplate(response); } //service层 void getExcelTemplate(HttpServletResponse response); //impl实现 Override public void getExcelTemplate(HttpServletResponse response) { try { // 1 读取对象 final ExcelReader reader ExcelUtil.getReader(ResourceUtil.getStream(templates/group.xlsx)); ListListObject lists reader.read(); ExcelWriter writer ExcelUtil.getWriter(true); writer.write(lists); response.setHeader(Content-disposition, attachment;filename URLEncoder.encode(group.xlsx, UTF-8)); response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet); // 2 写出对象 ServletOutputStream outputStream response.getOutputStream(); // 通过IO写出我们的表格对象 writer.flush(outputStream, true); writer.close(); IoUtil.close(outputStream); } catch (IOException e) { log.error(EducationServiceImpl [export] 输出到响应流失败, e); throw new APIException(导出Excel异常); } }4.4 Excel数据导入导出这里我使用的是三层构建在controller 层中暴露接口进行调用所有的具体实现进行抽象。//导入信息 RequestMapping(/importStudent) public R importStudent(RequestParam MultipartFile file) { try { boolean userInfo groupUserService.getUserInfo(file); if(userInfo) return R.success(); } catch (IOException e) { log.error(EducationController [getEducation] 获取输入流失败, e); throw new APIException(获取输入流失败); } return R.error(); } //导出信息 RequestMapping(/export) public void export(RequestBody PageVo pageVo, HttpServletResponse response) { groupUserService.export(pageVo, response); } //service接口 void export(PageVo pageVo, HttpServletResponse response); boolean getUserInfo(MultipartFile file) throws IOException; //实现类 Override public void export(PageVo pageVo, HttpServletResponse response) { // 从数据库查出数据对象封装成map final ListMapString, Object educationList this.page(new Page(pageVo.getPage(), pageVo.getLimit()), Wrappers.lambdaQuery()).getRecords() .stream() // 封装成 Map 并且放入 List .map(item - { final MapString, Object map new LinkedHashMap(); // 错误这里需要根据表中字段别名进行命名 map.put(nickname, item.getNickname()); map.put(sex, item.getSex()); map.put(mobile, item.getMobile()); map.put(bornTime, item.getBornTime()); map.put(homeAddress, item.getHomeAddress()); map.put(post, item.getPost()); return map; }) .collect(Collectors.toList()); // 准备将数据集合封装成Excel对象 ExcelWriter writer ExcelUtil.getWriter(true); // 通过工具类创建writer并且进行别名 writer.addHeaderAlias(nickname, 姓名); writer.addHeaderAlias(sex, 性别( 0 表示男 1 表示 女)); writer.addHeaderAlias(mobile, 电话); writer.addHeaderAlias(bornTime, 出生日期); writer.addHeaderAlias(homeAddress, 家庭地址); writer.addHeaderAlias(post, 职位); // 准备将对象写入我们的 List writer.write(educationList, true); try { // 获取我们的输出流 final OutputStream output response.getOutputStream(); response.setHeader(Content-disposition, attachment;filename URLEncoder.encode(group.xlsx, UTF-8)); response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet); writer.flush(output, true); writer.close(); // 这里可以自行关闭资源或者写一个关闭资源的工具类 IoUtil.close(output); } catch (IOException e) { log.error(EducationServiceImpl [export] 输出到响应流失败, e); throw new APIException(导出Excel异常); } } Override public boolean getUserInfo(MultipartFile file) throws IOException { ExcelReader reader ExcelUtil.getReader(file.getInputStream()); HashMapString, String head new HashMap(6); head.put(姓名,nickname); head.put(性别( 0 表示男 1 表示 女),sex); head.put(电话,mobile); head.put(出生日期, bornTime); head.put(家庭地址,homeAddress); head.put(职位,post); reader.setHeaderAlias(head); ListGroupUser read reader.read(0, 1, GroupUser.class); Group group groupService.getOne(new QueryWrapperGroup().eq(uid, UserConstant.USER_ID)); for (GroupUser user : read) { user.setGroupId(group.getId()); //TODO 默认图片 user.setPhoto(https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png); user.setStatus(1); user.setCreateTime(new DateTime()); if(!this.save(user))return false; } return true; }

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…