第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 等集合的各种操作
JSONUtilJSON 处理Java 对象和 JSON 字符串之间的无缝转换
ObjectUtil对象操作安全地进行对象判空、克隆、比较等操作
HttpUtilHTTP 客户端工具用极简的代码完成 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() {
    @Override
    public void start() {
        System.out.println("开始下载...");
    }
    @Override
    public void progress(long progressSize) {
        System.out.println("已下载: " + progressSize + " bytes");
    }
    @Override
    public 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);
    // 结果是一个map
    JSONObject jsonObject = JSONUtil.parseObj(result);
    // 判断接口响应是否出错
    if(ObjectUtil.isNotEmpty(jsonObject.getInt("errcode"))) {
        throw new RuntimeException(jsonObject.getStr("errmsg"));
    }

    String openid = jsonObject.getStr("openid");

    return openid;
}

6. 学习建议

  1. 多看文档:Hutool 的官方文档非常详细,遇到问题首先查阅文档。
  2. 动手实践:在项目中积极尝试使用 Hutool 的工具类来替代自己编写的工具方法。
  3. 由简入繁:先从最常用的 StrUtil, CollUtil, JSONUtilHttpUtil 开始,逐步扩展到其他模块。
  4. 注意版本:不同版本的 Hutool 方法可能会有差异,注意查看对应版本的文档。

Hutool 就像一把瑞士军刀,能极大提升你的 Java 开发效率和幸福感。希望这篇笔记能帮你快速上手!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值