Hutool使用
关于hutool工具包的使用:https://www.hutool.cn/docs/#/
1. 核心工具 (hutool-core
)
这是 Hutool 最基础也是最核心的模块,几乎所有项目都会用到。
**StrUtil**
** - 字符串工具类**
这是 Apache Commons Lang 中 StringUtils
的有力补充和增强。
- 判断空字符串: 提供了
isEmpty
、isNotEmpty
、isBlank
、isNotBlank
等方法。其中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:ss
、yyyy/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 功能主要围绕两个核心类展开:
**HttpUtil**
: 静态工具类,封装了最最常用的请求,适合一行代码搞定的简单场景。**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
对象来读取xls
或xlsx
文件。
写入 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 的读取功能非常智能,能够自动识别 xls
和 xlsx
格式,并且可以灵活地将数据读取为多种 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版本