当前位置: 首页 > news >正文

Hutool使用

关于hutool工具包的使用:https://www.hutool.cn/docs/#/

1. 核心工具 (hutool-core)

这是 Hutool 最基础也是最核心的模块,几乎所有项目都会用到。

**StrUtil**** - 字符串工具类**

这是 Apache Commons Lang 中 StringUtils 的有力补充和增强。

  • 判断空字符串: 提供了 isEmptyisNotEmptyisBlankisNotBlank 等方法。其中 isBlank 会将不可见的空白字符(如空格、制表符)也视为空。
  • 模板格式化: StrUtil.format() 方法可以使用 {}作为占位符,安全且优雅地拼接字符串,灵感来源于 SLF4J。 Java
String template = "你好,{},今天是{}";
String result = StrUtil.format(template, "张三", "星期一");
// result -> "你好,张三,今天是星期一"
  • 移除前后缀: removePrefix()removeSuffix() 可以方便地移除字符串的指定前缀或后缀。
  • 安全截取: sub() 方法可以安全地截取字符串,无需担心索引越界异常。
**DateUtil**** - 日期时间工具类**

极大地简化了 Java 中繁琐的日期时间操作。

  • 获取当前时间: DateUtil.now() 返回当前时间字符串,DateUtil.date() 返回 DateTime 对象。
  • 字符串与日期转换: parse() 方法能智能地将各种格式的字符串(如 yyyy-MM-dd HH:mm:ssyyyy/MM/dd)转换为日期对象。
  • 日期计算: 提供了 offsetDay()offsetHour() 等方法,可以方便地对日期进行前后偏移计算。
  • 格式化: format() 方法可以将日期对象格式化为指定的字符串形式。
  • 时间差计算: between() 方法可以计算两个日期之间相差的天数、小时数、分钟数等。
**BeanUtil**** - JavaBean 工具类**

主要用于对象的属性复制和操作,是 DTO、VO、Entity 之间转换的利器。

  • 属性拷贝: BeanUtil.copyProperties(source, target) 是最常用的方法,用于将一个对象的属性值快速复制到另一个对象中。
  • Bean 转 Map: BeanUtil.beanToMap(bean) 可以将一个 JavaBean 对象转换为 Map
  • Map 转 Bean: BeanUtil.toBean(map, Bean.class) 可以将 Map 对象转换为指定的 JavaBean 对象。
  • 拷贝选项: CopyOptions 提供了丰富的自定义选项,例如可以忽略 null 值的属性、忽略某些特定属性、忽略拷贝过程中发生的错误等。
**CollUtil**** - 集合工具类**

对 Java 集合框架(List, Set, Map)的增强。

  • 集合连接: CollUtil.join() 可以将集合或数组中的元素用指定的分隔符连接成一个字符串。
  • 判空: isEmpty()isNotEmpty() 可以判断集合是否为 null 或没有元素。
  • 过滤: filter() 方法可以方便地根据条件筛选集合中的元素。
  • Map 转换: zip() 方法可以将两个集合的元素按顺序一一对应,组合成一个 Map
**Convert**** - 类型转换工具类**

提供了一整套的类型转换解决方案,可以方便地在各种数据类型之间进行转换,例如 toInt(), toStr(), toDate() 等。

2. 加密解密 (hutool-crypto)

封装了常见的对称加密(如 AES、DES)、非对称加密(如 RSA)以及摘要算法(如 MD5、SHA1),让加密解密操作变得非常简单。

  • 对称加密 (AES): Java
AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, key, iv);
String encrypt = aes.encryptBase64("我是一段测试文字");
String decrypt = aes.decryptStr(encrypt);
  • 摘要算法 (MD5): Java
String md5 = SecureUtil.md5("123456");

3. HTTP 客户端 (hutool-http)

基于 JDK 的 HttpUrlConnection 封装,无需引入其他第三方库,就能轻松地发送 HTTP 请求。

  • 链式调用: HttpRequest 对象支持链式调用,代码可读性高。
  • GET/POST 请求: HttpUtil.get()HttpUtil.post() 方法可以一行代码完成请求。 Java
// GET 请求
String result = HttpUtil.get("https://www.baidu.com");// POST 请求(表单)
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("city", "北京");
String postResult = HttpUtil.post("https://www.example.com/api", paramMap);
  • 文件上传/下载: 极大地简化了文件的上传和下载操作。

Hutool HTTP 能否替代 Apache HttpClient?

答案是:在大多数常见场景下,可以替代,但对于非常复杂的专业场景,HttpClient 依然是首选。

这取决于你的项目需求和对“替代”的定义。

特性Hutool HTTP (HttpUtil
)
Apache HttpClient
设计哲学简洁、易用、快速开发。追求用最少的代码完成最常见的需求。专业、全面、高度可配置。提供对 HTTP 协议的完全控制。
依赖性轻量级,仅依赖 JDK,无其他第三方库。相对较重,需要引入 httpclient
httpcore
等多个包。
易用性非常高。静态工具类,链式调用,代码可读性极佳。相对复杂。需要创建客户端、请求对象、执行、处理响应,代码量较多。
核心功能覆盖了 95% 以上的常用功能:GET/POST、文件上传/下载、JSON/表单请求、超时、代理、Cookie、HTTPS。功能非常全面,支持连接池管理、请求重试机制、复杂的认证方案(Kerberos)、路由策略等。
适用场景1. 中小型项目。<br>2. 快速开发和原型验证。<br>3. 调用第三方 RESTful API。<br>4. 项目中已经引入 Hutool,希望统一技术栈。1. 大型、企业级应用。<br>2. 需要精细控制连接池、超时和重试的高并发场景。<br>3. 需要处理复杂认证和代理的系统。<br>4. 构建专业的爬虫或 API 网关。

导出到 Google 表格

结论:

  • 如果你只是想简单地调用一个接口、上传一个文件、或者快速构建一个微服务,Hutool 不仅能替代 HttpClient,而且体验会好得多,能帮你节省大量代码。
  • 如果你正在构建一个需要处理成千上万并发连接、需要精细化管理连接池和路由策略的高性能系统,那么功能更底层、更全面的 Apache HttpClient 仍然是更专业的选择

Hutool HTTP 详细讲解

Hutool 的 HTTP 功能主要围绕两个核心类展开:

  1. **HttpUtil**: 静态工具类,封装了最最常用的请求,适合一行代码搞定的简单场景。
  2. **HttpRequest**: 链式调用的请求对象,提供了对请求的完全控制,是构建复杂请求的核心。
一、 快速入门:HttpUtil 的便捷之道

HttpUtil 的设计目标就是“快”,用一个静态方法解决一个问题。

GET 请求

  • Java
// 最简单的 GET 请求
String responseBody = HttpUtil.get("https://www.baidu.com");
System.out.println(responseBody);// 带参数的 GET 请求
HashMap<String, Object> params = new HashMap<>();
params.put("wd", "Hutool");
String searchResult = HttpUtil.get("https://www.baidu.com/s", params);

POST 请求

  • Java
// 发送表单格式的 POST 请求
HashMap<String, Object> formParams = new HashMap<>();
formParams.put("username", "admin");
formParams.put("password", "123456");
String loginResult = HttpUtil.post("https://example.com/login", formParams);

文件下载

  • Java
// 下载文件到指定目录,返回文件大小
long size = HttpUtil.downloadFile("https://example.com/file.zip", "d:/");
二、 精准控制:HttpRequest 的链式调用

当你需要设置请求头、超时、请求体格式等复杂参数时,就需要使用 HttpRequest。它的所有设置方法都返回自身,可以非常优雅地进行链式调用。

**HttpRequest**** 的通用执行流程:**HttpRequest.of(url).method(Method.XXX).setXXX().setXXX().execute()

Java

// 创建一个 POST 请求对象
HttpRequest request = HttpRequest.post("https://api.example.com/users");

1. 设置请求头 (**header**)

Java

request.header("Authorization", "Bearer your_token_here");
request.header("Content-Type", "application/json");

2. 设置超时时间 (**timeout**)

Java

// 设置连接超时和读取超时均为 5 秒
request.timeout(5000);

3. 设置请求体 (**body**)

发送 JSON 数据

  • Java
// Hutool 会自动将 JSON 字符串或 JSONObject 设置为请求体,并设置 Content-Type 为 application/json
String jsonBody = "{\"name\":\"张三\", \"age\":25}";
request.body(jsonBody);

发送表单数据

  • Java
// Hutool 会自动将 Map 设置为表单,并设置 Content-Type 为 application/x-www-form-urlencoded
request.form("key1", "value1").form("key2", 123);

4. 执行请求并获取响应 (**execute**)

.execute() 方法会返回一个 HttpResponse 对象,你可以从中获取响应的各种信息。

Java

// 执行请求
HttpResponse response = request.execute();// 判断请求是否成功
if (response.isOk()) {// 获取响应状态码int status = response.getStatus(); // 200// 获取响应体字符串String body = response.body();System.out.println(body);// 获取为字节数组byte[] bytes = response.bodyBytes();// 获取响应头String contentType = response.header("Content-Type");
} else {System.out.println("请求失败,状态码:" + response.getStatus());
}
三、 文件上传

文件上传是 HttpRequest 的一个经典应用场景。

Java

HttpRequest uploadRequest = HttpRequest.post("https://example.com/upload");// 'file' 是服务端接收文件的参数名
// 'new File("d:/avatar.jpg")' 是要上传的文件
uploadRequest.form("file", new File("d:/avatar.jpg"));
uploadRequest.form("username", "Hutool"); // 附带其他表单参数HttpResponse uploadResponse = uploadRequest.execute();
System.out.println(uploadResponse.body());
四、 HTTPS 请求和证书信任

Hutool 默认开启了不安全的 HTTPS 连接(即信任所有证书),这在开发和测试内部系统时非常方便,无需处理复杂的证书导入。

如果你需要与一个受信任的权威机构签发的网站通信,Hutool 会自动处理。如果需要连接到一个使用自签名证书的、需要手动信任的服务器,可以直接使用,无需额外配置。

4. Office 文档操作 (hutool-poi)

这是对 Apache POI 的二次封装,大大降低了操作 Excel 等 Office 文档的难度。

  • 读取 Excel: ExcelUtil.getReader() 可以轻松获取一个 ExcelReader 对象来读取 xlsxlsx 文件。

写入 Excel: ExcelWriter 可以方便地将 List<Bean>List<Map> 类型的数据直接写入到 Excel 文件中,并能自动生成表头。

  • Java
// 假设有 List<User> testData;
ExcelWriter writer = ExcelUtil.getWriter("d:/test.xlsx");
// 一次性写出内容,强制输出标题
writer.write(testData, true);
writer.close();

Hutool Excel 操作核心 (ExcelUtil)

ExcelUtil 是操作 Excel 的核心入口,提供了获取读取器 (ExcelReader) 和写入器 (ExcelWriter) 的静态方法。

一、 Excel 读取 (ExcelReader)

Hutool 的读取功能非常智能,能够自动识别 xlsxlsx 格式,并且可以灵活地将数据读取为多种 Java 对象。

**1. 获取读取器 ****ExcelReader**

Java

// 从文件路径加载
ExcelReader reader = ExcelUtil.getReader("d:/用户信息.xlsx");// 从文件对象加载
File file = new File("d:/用户信息.xlsx");
ExcelReader readerWithFile = ExcelUtil.getReader(file);// 从流加载
// InputStream in = ...;
// ExcelReader readerWithStream = ExcelUtil.getReader(in);

2. 读取数据

Hutool 提供了多种方式来读取 Sheet 中的数据。

读取为 List<List<Object>>(最原始的方式) 这会将每一行读取为一个 List<Object>,所有行再组成一个大的 List

  • Java
List<List<Object>> readAll = reader.read();
for (List<Object> row : readAll) {System.out.println(row);
}

读取为 List<Map<String, Object>> 这会将 Excel 的表头作为 Map 的 key,对应单元格的内容作为 value。非常适合处理有标题行的表格。

  • Java
// 默认第一行为标题行
List<Map<String, Object>> readAllAsMap = reader.readAll();
for (Map<String, Object> row : readAllAsMap) {System.out.println(row);
}

读取为 List<Bean>(最常用、最推荐) 这是最强大的功能。它可以自动将每一行数据映射到一个 Java Bean 对象中,极大提升了开发效率。

首先,定义一个 Bean:

  • Java
public class User {private String name;private Integer age;private String email;// 省略 getter/setter...
}

然后,设置表头和 Bean 属性的映射关系:

Java

// 别名映射:将 Excel 的中文标题映射到 Bean 的英文字段上
reader.addHeaderAlias("姓名", "name");
reader.addHeaderAlias("年龄", "age");
reader.addHeaderAlias("邮箱", "email");// 读取数据并自动转换为 User 对象列表
List<User> userList = reader.readAll(User.class);
for (User user : userList) {System.out.println(user);
}

3. 关闭读取器 在操作完成后,记得关闭 reader 以释放资源。

Java

reader.close();

二、 Excel 写入 (ExcelWriter)

Hutool 的写入功能同样强大,支持将 Java 对象直接写入 Excel,并能方便地设置样式。

**1. 获取写入器 ****ExcelWriter**

Java

// 写入到指定路径的文件,如果文件不存在会自动创建
ExcelWriter writer = ExcelUtil.getWriter("d:/导出数据.xlsx");// 写入到指定 Sheet
// ExcelWriter writerWithSheet = ExcelUtil.getWriter("d:/导出数据.xlsx", "Sheet2");

2. 写入数据

通过 **List<Bean>** 写入(最常用) 这是导出数据最便捷的方式。Hutool 会自动使用 Bean 的字段名作为表头。

  • Java
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 20, "zhangsan@example.com"));
userList.add(new User("李四", 22, "lisi@example.com"));// 自定义标题别名(可选)
writer.addHeaderAlias("name", "姓名");
writer.addHeaderAlias("age", "年龄");
writer.addHeaderAlias("email", "邮箱");// 一次性将 List<User> 写入 Excel,并生成标题行
writer.write(userList, true);
  • 通过 **List<Map<String, Object>>** 写入 也可以将 Map 列表写入,Map 的 key 会被用作表头。
  • 写入单个单元格 可以使用 writeCellValue(col, row, value) 方法向指定坐标的单元格写入数据。

3. 设置样式 Hutool 允许你方便地设置单元格、表头、行或列的样式。

设置列宽

  • Java
writer.setColumnWidth(0, 20); // 第 0 列宽度设置为 20
writer.setColumnWidth(1, 10); // 第 1 列宽度设置为 10

设置单元格样式(字体、颜色、对齐方式)

  • Java
// 获取样式对象
StyleSet style = writer.getStyleSet();
// 设置背景色
style.setBackgroundColor(IndexedColors.LIGHT_YELLOW, false);// 获取头部单元格样式,并设置字体
CellStyle headCellStyle = writer.getHeadCellStyle();
Font font = writer.createFont();
font.setBold(true);
font.setColor(IndexedColors.RED.getIndex());
headCellStyle.setFont(font);

合并单元格merge(firstRow, lastRow, firstCol, lastCol, content)

  • Java
// 合并第一行的前三列,并写入内容
writer.merge(0, 0, 0, 2, "用户信息总览", false);

4. 处理大数据 (**BigExcelWriter**) 当需要导出大量数据(如超过十万行)时,使用普通的 ExcelWriter 可能会导致内存溢出(OOM)。Hutool 提供了 BigExcelWriter 来解决这个问题。

它基于 SXSSF 实现,采用流式写入的方式,将数据分批写入磁盘的临时文件,从而占用极少的内存。

Java

// 使用方式与普通 Writer 完全一样,Hutool 内部会自动处理
BigExcelWriter bigWriter = ExcelUtil.getBigWriter("d:/海量数据.xlsx");
// ... 后续的 write() 操作与普通 ExcelWriter 相同
bigWriter.write(hugeDataList, true);
bigWriter.close();

5. 关闭写入器 操作完成后,必须调用 close() 方法,它会将缓冲区的内容写入文件并关闭流。

Java

writer.close();

三、 Word 文档操作 (Word07Writer)

相对于 Excel,Hutool 对 Word 的操作支持比较基础,主要集中在创建和写入.docx 格式的文档,适合生成简单的报告或通知。

1. 获取写入器

Java

Word07Writer wordWriter = new Word07Writer();

2. 添加内容

添加文本和样式

  • Java
// 添加带有样式的文本(设置字体、字号、颜色、加粗)
Font font = new Font("方正舒体", Font.PLAIN, 22);
font.setColor(Color.RED);
wordWriter.addText(font, "这是一个一级标题");
wordWriter.addText(new Font(), "\n", "这是一段正文内容..."); // 添加换行和正文

添加图片

  • Java
// 添加图片,并设置宽高
wordWriter.addPicture(new File("d:/logo.png"), 100, 50);

添加表格

  • Java
// 添加一个 3x3 的表格
Table table = wordWriter.addTable(3, 3);

3. 生成文件

Java

wordWriter.flush(new File("d:/生成的报告.docx"));
wordWriter.close();

总的来说,Hutool 的 hutool-poi 模块极大地降低了 Java 操作 Office 文档的技术门槛,尤其是其对 Excel 的支持非常完善和强大,是 Java Web 开发中处理数据导入导出的首选方案之一。

5. 其他常用模块

  • **hutool-log**: 自动识别并适配项目中的日志框架(如 Log4j, Logback, SLF4J 等)的日志门面。
  • **hutool-captcha**: 用于生成各种样式的图片验证码。
  • **hutool-json**: 提供了对 JSON 的封装和操作能力。
  • **hutool-extra**: 扩展模块,封装了对第三方库的集成,如邮件、FTP、二维码等。
  • jwt:token的plus版本
http://www.xdnf.cn/news/643033.html

相关文章:

  • 针对面试- RabbitMQ消息队列篇
  • 【linux】umask权限掩码
  • Java类和对象知识点
  • 从lateral说起
  • Ansible常用Ad-Hoc 命令
  • react问一问
  • Axure 基本用法学习笔记
  • 修复ubuntu server笔记本合盖导致的无线网卡故障
  • 触发进程守护服务的判断因数
  • 《帝国时代1》游戏秘籍
  • 【2025】基于Springboot + vue + 协同过滤算法实现的旅游推荐系统
  • 云手机应该怎么选?和传统手机有什么区别?哪些云手机支持安卓12系统?
  • 第五十节:增强现实基础-特征点检测与匹配
  • springboot中过滤器配置使用
  • 基于RK3576+FPGA+CODESYS工控板的运动控制模块方案
  • 字节跳动GPU Scale-up互联技术白皮书
  • 使用CRTP实现单例
  • [yolov11改进系列]基于yolov11引入双层路由注意力机制Biformer解决小目标遮挡等问题python源码+训练源码
  • 优秀技术文档的构建与优化之道
  • Typescript学习教程,从入门到精通,TypeScript 进阶语法知识点及案例代码详解(13)
  • QStandardItemModel的函数和信号介绍
  • Java单例模式:懒汉模式详解
  • MyBatis-Plus一站式增强组件MyBatis-Plus-kit:打造更优雅的通用CRUD解决方案
  • 15 dart类(get,set,静态,继承,抽象,接口,混入)
  • AUTOSAR图解==>AUTOSAR_SRS_Libraries
  • java数组,ArrayList,LinkedList
  • win主机,Ubuntu,IMX6ULL开发板网络通讯
  • 神经网络学习-Day35
  • 麒麟V10 SP1 2303使用记录(一)安装google浏览器
  • 提高:RMQ问题:【例 3】与众不同