# Java hutool 糊涂工具

# 1. 介绍

官网: https://doc.hutool.cn/pages/index/

一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:

模块 介绍
hutool-aop JDK动态代理封装,提供非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 脚本执行封装,例如Javascript
hutool-setting 功能更强大的Setting配置文件和Properties封装
hutool-system 系统参数调用封装(JVM信息等)
hutool-json JSON实现
hutool-captcha 图片验证码实现
hutool-poi 针对POI中Excel和Word的封装
hutool-socket 基于Java的NIO和AIO的Socket封装
hutool-jwt JSON Web Token (JWT)封装实现
hutool-ai AI大模型封装实现

依赖:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.40</version>
</dependency>

# 2. RandomUtil

# 2.1. 生成 6 位数字验证码

import cn.hutool.core.util.RandomUtil;

// 6 位数字验证码
String captcha = RandomUtil.randomNumbers(6);

# 2.2. 生成名称随机字符串

import cn.hutool.core.util.RandomUtil;

// 首次注册,生成的用户昵称
String nickname = "user_" + RandomUtil.randomString(6);

# 3. UUID

# 3.1. 生成随机 token

// true - 不带中划线的 UUID
String token = UUID.randomUUID().toString(true); 

# 4. BeanUtil

# 4.1. 拷贝 bean 中属性

// 将 user 里的属性拷贝到 新建的UserDTO 并返回
UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);

// 忽略一些属性
String[] ignoredProps = { 'id', 'age' };
UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class, ignoredProps);

// 针对有泛型的 Map, 直接使用 Map.class 作为参数会报泛型警告
Map<String, Object> srcRecord = new HashMap<>();
Map<String, Object> targetRecord = new HashMap<>();
BeanUtil.copyProperties(srcRecord, targetRecord)

# 4.2. 拷贝 list

// 1.查询出 PO list
List<User> users = userService.listByIds(ids);

// 2.将 PO list 转 VO list
List<UserVO> userVoList = BeanUtil.copyToList(users, UserVO.class);

# 4.3. bean 转 Map

Map<String, Object> userMap = BeanUtil.beanToMap(userDTO);


// 自定义转换选项
CopyOptions copyOptions = CopyOptions.create()
            .setIgnoreNullValue(true)
            // 将 值 转为 字符串
            .setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString());

Map<String, Object> userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(), copyOptions);

# 4.4. Map 转 bean

// false - 不忽略错误
UserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);

# 5. StrUtil

# 5.1. 判断字符串是否有值

String token = '123';
boolean b = StrUtil.isEmpty(token);

# 5.2. 判断对象是否为空白字符串

Object token = '123';
boolean b = StrUtil.isBlankIfStr(token);

# 5.3. 字符串模板

// 使用StrUtil的format方法格式化字符串
String result = StrUtil.format("Hello, {}! Welcome to {}.", "World", "Hutool");

# 6. CollectionUtil (废弃)

# 6.1. 集合是否为空

CollectionUtil.isEmpty(userMap)

# 7. CollUtil

# 7.1. 判断集合是否为空

CollUtil.isEmpty(userMap)

# 8. JSONUtil

# 8.1. json 转 bean

Shop shop = JSONUtil.toBean(shopJsonStr, Shop.class);

# 8.2. bean 转 json

String showJsonStr = JSONUtil.toJsonStr(shop);

// 格式化日期类型的属性
JSONConfig jsonConfig = new JSONConfig();
jsonConfig.setDateFormat(DatePattern.NORM_DATETIME_PATTERN);

String showJsonStr = JSONUtil.toJsonStr(shop, jsonConfig);

# 8.3. json 转 List

List<User> list = JSONUtil.toList(str, User.class);

# 8.4. 是否为数组 json 字符串

// 是否为 JSONArray 类型的字符串,首尾都为中括号判定为 JSONArray 字符串
boolean isValidArrayJson = JSONUtil.isTypeJSONArray(str);

# 9. DateUtil

# 9.1. 当前日期加 1 秒

Date createDate = DateUtil.offset(new Date(), DateField.SECOND, 1).toJdkDate();

# 9.2. 格式化日期

// arg1: LocalDateTime | Date
String dateStr = DateUtil.format(LocalDateTime.now(), DatePattern.NORM_DATETIME_PATTERN);

// -- 参考

public class DatePattern {
	/**
	 * 标准日期格式:yyyy-MM-dd
	 */
	public static final String NORM_DATE_PATTERN = "yyyy-MM-dd";
    /**
     * 标准日期时间格式,精确到秒:yyyy-MM-dd HH:mm:ss
     */
    public static final String NORM_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    // ...
}

# 10. BooleanUtil

# 10.1. 检查 Boolean 值是否为 true

BooleanUtil.isTrue(Boolean.TRUE)  = true
BooleanUtil.isTrue(Boolean.FALSE) = false
BooleanUtil.isTrue(null)          = false

# 11. FileUtil

# 11.1. 根据 文件名或路径 获取 MIME

String fileName = "test.jpg";
String mimeType = FileUtil.getMimeType(fileName);
System.out.println(mimeType); // 输出:image/jpeg

# 11.2. 修复路径

/*
如果原路径尾部有分隔符,则保留为标准分隔符(/),否则不保留
1. 统一用 /
2. 多个 / 转换为一个 /
3. 去除左边空格
4. .. 和 . 转换为绝对路径,当..多于已有路径时,直接返回根路径

"/foo//"        => "/foo/"
"/foo/./"       => "/foo/"
"/foo/../bar"   => "/bar"
"/foo/../bar/"  => "/bar/"
"/foo/../bar/../baz" => "/baz"
*/ 
FileUtil.normalize(String path)

# 11.3. 遍历目录下所有文件

/*
递归遍历目录以及子目录中的所有文件
如果用户传入相对路径,则是相对classpath的路径
如:"test/aaa"表示"${classpath}/test/aaa"
*/
List<File> fileList = FileUtil.loopFiles("D:/dev");

# 11.4. 参考

# 12. CharsetDetector

# 12.1. 弹出文件的字符集

InputStream minIoObject = minioUtils.readMinioObjectFileStream(minIoObjectName);
Charset fileCharset = CharsetDetector.detect(minIoObject);

// 如果 in 不是“合法”的 InputStream,可以使用 ByteArrayInputStream
byte[] body = IOUtils.toByteArray(minIoObject);
fileCharset = CharsetDetector.detect(new ByteArrayInputStream(body));

// fileCharset.toString()

# 13. ListUtil

# 13.1. 截取 List

// 包头,不包尾;返回副本
ListUtil.sub(list, 1, 3);

# 14. DataSizeUtil

# 14.1. 字节数转 KB/MB

Long b=1L;
Long kb=1024L;
Long mb=1048576L;
Long gb=1073741842L;
Long tb=1099511627776L;

System.out.println(DataSizeUtil.format( b));  //=> "1 B"
System.out.println(DataSizeUtil.format( kb)); //=> "1 KB"
System.out.println(DataSizeUtil.format( mb)); //=> "1 MB"
System.out.println(DataSizeUtil.format( gb)); //=> "1 GB"
System.out.println(DataSizeUtil.format( tb)); //=> "1 TB"

# 15. Base64

# 15.1. 解码 base64 字符串

String str = Base64.decodeStr(base64Str);

# 16. ResourceUtil

# 16.1. 读取 Resource 目录下的文件

// 找不到资源抛异常
InputStream inputStream1 = ResourceUtil.getStream("classpath:application.yml");

// "classpath:" 可以省略
InputStream inputStream2 = ResourceUtil.getStream("application.yml");

// 找不到资源返回 null
InputStream inputStream3 = ResourceUtil.getStreamSafe("application.yml");

# 17. NumberUtil

# 17.1. string 转 int/long/double

NumberUtil.parseInt("1.56"); //=> 1
NumberUtil.parseDouble("1"); //=> 1.0

# 18. ObjectUtil

# 18.1. 判断 多个对象 是否存在 null

ObjectUtil.hasNull(obj1, obj2, ...)
本章目录