第11章 [特殊字符]️Hutool 常用工具类
第11章 🛠️Hutool 常用工具类
Hutool 是一款非常流行的 Java 工具类库,它的目标是减少项目中重复的工具代码,让开发更专注于业务逻辑,写出高效且优雅的代码。下面我用笔记的形式为你介绍 Hutool 中几个常用的工具类,特别是 HTTP 客户端工具,并用简单易懂的方式解释。
1. 什么是 Hutool?
Hutool 是一个 Java 工具类库,提供了很多静态方法封装,覆盖了字符串处理、日期时间操作、加密解密、文件处理、集合处理、HTTP 请求等方方面面。它的理念是 “小而全”,旨在简化 Java 开发中的各种常见操作。
2. 安装 Hutool
在 Maven 项目的 pom.xml
中添加以下依赖即可引入 Hutool:
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.10</version> <!-- 请留意官网最新版本 -->
</dependency>
3. 常用工具类速览
工具类 | 主要用途 | 一句话描述 |
---|---|---|
StrUtil | 字符串处理 | 让字符串操作(判空、格式化、拆分等)更简单高效 |
CollUtil | 集合操作 | 轻松玩转 List、Map 等集合的各种操作 |
JSONUtil | JSON 处理 | Java 对象和 JSON 字符串之间的无缝转换 |
ObjectUtil | 对象操作 | 安全地进行对象判空、克隆、比较等操作 |
HttpUtil | HTTP 客户端工具 | 用极简的代码完成 HTTP 请求,支持 GET/POST/文件上传下载等 |
4. 核心工具类详解
4.1 字符串工具 (StrUtil)
StrUtil
提供了比 Java 原生 String
更友好、更强大的字符串操作方法。
import cn.hutool.core.util.StrUtil;// 1. 判空(比原生更友好,空字符串和null都视为空)
String str = "test";
boolean isEmpty = StrUtil.isEmpty(str); // true if null or ""
boolean isNotEmpty = StrUtil.isNotEmpty(str);
boolean isBlank = StrUtil.isBlank(" "); // true (只包含空白字符也算"空")// 2. 格式化字符串(类似 Slf4j)
String template = "这只是个占位符:{}";
String str2 = StrUtil.format(template, "我是占位符"); // "这只是个占位符:我是占位符"// 3. 拆分字符串
String[] parts = StrUtil.split("a,b,c", ","); // ["a", "b", "c"]
List<String> partList = StrUtil.splitTrim("a, b , c", ","); // ["a", "b", "c"] (自动去除空白)// 4. 去除前缀/后缀
String fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg"); // "pretty_girl"
String fileNameWithoutPrefix = StrUtil.removePrefix("a.jpg", "a."); // "jpg"// 5. 字符串颠倒
String reversed = StrUtil.reverse("abcd"); // "dcba"
4.2 集合工具 (CollUtil)
CollUtil
让集合操作变得非常方便,尤其适合处理常见的 List 和 Map 操作。
import cn.hutool.core.collection.CollUtil;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.HashMap;// 1. 快速创建集合
List<String> list = CollUtil.newArrayList("A", "B", "C");
Map<String, Integer> map = CollUtil.newHashMap("key1", 1, "key2", 2);// 2. 集合判空
boolean isEmpty = CollUtil.isEmpty(list); // false
boolean isNotEmpty = CollUtil.isNotEmpty(list); // true// 3. 集合分组(每2个一组)
List<List<String>> group = CollUtil.split(list, 2); // [["A", "B"], ["C"]]// 4. 过滤空值
List<String> listWithNull = Arrays.asList("A", null, "C");
List<String> filtered = CollUtil.filter(listWithNull, Objects::nonNull); // ["A", "C"]// 5. 连接集合元素
String joinedStr = CollUtil.join(list, ","); // "A,B,C"
4.3 JSON 工具 (JSONUtil)
JSONUtil
提供了非常简单的 API 来处理 JSON 和 Java 对象之间的转换。
import cn.hutool.json.JSONUtil;
import java.util.List;
import java.util.Map;// 1. 对象转 JSON 字符串
User user = new User("Alice", 30);
String jsonStr = JSONUtil.toJsonStr(user); // {"name":"Alice","age":30}// 2. JSON 字符串转对象
String jsonString = "{\"name\":\"Alice\",\"age\":30}";
User userFromJson = JSONUtil.toBean(jsonString, User.class);// 结果是一个map
JSONObject jsonObject = JSONUtil.parseObj(result);
// 判断接口响应是否出错
if(ObjectUtil.isNotEmpty(jsonObject.getInt("errcode"))) {throw new RuntimeException(jsonObject.getStr("errmsg"));
}String openid = jsonObject.getStr("openid");// 3. List 转 JSON 数组
List<User> userList = Arrays.asList(new User("Alice", 30), new User("Bob", 25));
String listJson = JSONUtil.toJsonStr(userList); // [{"name":"Alice","age":30}, {"name":"Bob","age":25}]// 4. JSON 数组转 List
String jsonArray = "[{\"name\":\"Alice\",\"age\":30}, {\"name\":\"Bob\",\"age\":25}]";
List<User> users = JSONUtil.toList(jsonArray, User.class);// 5. JSON 字符串转 Map
String jsonStr = "{\"name\":\"Alice\",\"age\":30}";
Map<String, Object> map = JSONUtil.toBean(jsonStr, Map.class);
4.4 对象工具 (ObjectUtil)
ObjectUtil
提供了对象的基本操作,如判空、比较、克隆等。
import cn.hutool.core.util.ObjectUtil;// 1. 对象判空
Object obj = null;
boolean isEmpty = ObjectUtil.isEmpty(obj); // true
boolean isNotEmpty = ObjectUtil.isNotEmpty(obj); // false// 2. 判断对象是否相等(安全地处理 null)
Object a = "hello";
Object b = "hello";
boolean isEqual = ObjectUtil.equal(a, b); // true// 3. 获取对象类型
Class<?> type = ObjectUtil.getType(a); // class java.lang.String// 4. 克隆对象(需要实现 Serializable 接口)
User original = new User("Alice", 30);
User cloned = ObjectUtil.clone(original);
4.5 HTTP 客户端工具 (HttpUtil)
HttpUtil
是 Hutool 对 JDK 原生 HttpURLConnection
的封装,让你用极简的代码完成各种 HTTP 请求,无需引入其他依赖。
4.5.1 发送 GET 请求
import cn.hutool.http.HttpUtil;// 最简单的 GET 请求
String result1 = HttpUtil.get("https://api.example.com/data");// 带参数的 GET 请求 (方式1: 拼接URL)
String result2 = HttpUtil.get("https://api.example.com/data?name=张三&age=18");// 带参数的 GET 请求 (方式2: 使用Map)
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("name", "张三");
paramMap.put("age", 18);
String result3 = HttpUtil.get("https://api.example.com/data", paramMap);
4.5.2 发送 POST 请求
// 发送简单 POST 请求 (提交字符串内容)
String result1 = HttpUtil.post("https://api.example.com/submit", "这是一段内容");// 发送表单 POST 请求 (类似 HTML 表单)
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("username", "admin");
paramMap.put("password", "123456");
String result2 = HttpUtil.post("https://api.example.com/login", paramMap);// 发送 JSON 数据 (常用 RESTful API)
HashMap<String, Object> jsonMap = new HashMap<>();
jsonMap.put("title", "Hello");
jsonMap.put("body", "This is a post.");
String jsonStr = JSONUtil.toJsonStr(jsonMap); // 先用 JSONUtil 将 Map 转为 JSON 字符串// 使用 HttpRequest (更灵活)
String result3 = HttpRequest.post("https://api.example.com/posts").header("Content-Type", "application/json") // 设置请求头.body(jsonStr).timeout(20000) // 设置超时时间(毫秒).execute().body();
4.5.3 文件下载与上传
// 文件下载 (简单版)
long size = HttpUtil.downloadFile("https://example.com/file.zip", new File("local.zip"));// 文件下载 (带进度监听)
HttpUtil.downloadFile("https://example.com/bigfile.zip", FileUtil.file("local.zip"), new StreamProgress() {@Overridepublic void start() {System.out.println("开始下载...");}@Overridepublic void progress(long progressSize) {System.out.println("已下载: " + progressSize + " bytes");}@Overridepublic void finish() {System.out.println("下载完成!");}
});// 文件上传
HashMap<String, Object> uploadMap = new HashMap<>();
uploadMap.put("file", FileUtil.file("path/to/your/photo.jpg")); // 指定要上传的文件
String uploadResult = HttpUtil.post("https://api.example.com/upload", uploadMap);
4.5.4 处理响应和高级配置
// 获取更详细的响应信息
HttpResponse response = HttpRequest.get("https://api.example.com/data").timeout(5000) // 设置超时.setProxy("127.0.0.1", 8888) // 设置代理 (如需).execute();int statusCode = response.getStatus(); // 获取状态码, 如 200
String contentType = response.header("Content-Type"); // 获取响应头
String body = response.body(); // 获取响应体// 错误处理
try {HttpResponse response = HttpRequest.get("https://api.example.com/data").timeout(20000).execute();if (response.isOk()) { // 检查请求是否成功 (状态码 200)String result = response.body();// 处理成功结果} else {// 处理服务器返回的错误 (如 404, 500)System.out.println("请求失败,状态码: " + response.getStatus());}
} catch (HttpException e) {// 处理网络异常 (如超时、连接失败)e.printStackTrace();
}
5. 实战案例:整合使用多个工具类
下面是一个综合使用多个 Hutool 工具类的实际例子:
/*** 获取openid* @param code* @return*/
@Override
public String getOpenid(String code) {// 获取公共参数Map<String,Object> paramMap = getAppConfig();paramMap.put("js_code", code);String result = HttpUtil.get(REQUEST_URL, paramMap);// 结果是一个mapJSONObject jsonObject = JSONUtil.parseObj(result);// 判断接口响应是否出错if(ObjectUtil.isNotEmpty(jsonObject.getInt("errcode"))) {throw new RuntimeException(jsonObject.getStr("errmsg"));}String openid = jsonObject.getStr("openid");return openid;
}
6. 学习建议
- 多看文档:Hutool 的官方文档非常详细,遇到问题首先查阅文档。
- 动手实践:在项目中积极尝试使用 Hutool 的工具类来替代自己编写的工具方法。
- 由简入繁:先从最常用的
StrUtil
,CollUtil
,JSONUtil
和HttpUtil
开始,逐步扩展到其他模块。 - 注意版本:不同版本的 Hutool 方法可能会有差异,注意查看对应版本的文档。
Hutool 就像一把瑞士军刀,能极大提升你的 Java 开发效率和幸福感。希望这篇笔记能帮你快速上手!