Hutool 是一个超全的 Java 工具库,深受国内开发者的喜爱。目前确实是成为了国内使用最广的工具库之一了, Gitee 上的 Star 数也到了 23k +。最近新版本有所改动,这里分享一下最新版本的介绍。
一、Hutool简介
Hutool 真心是一个不错的国产 Java 工具类库,功能全面,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行了封装,开箱即用!
官方是这样介绍 Hutool 的:
Hutool 包含的组件
Hutool 包含的组件以及组件提供的功能如下表所示:
模块 | 介绍 |
---|---|
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-all方式引入所有模块。不过,还是不建议引入所有模块,因为绝大部分功能项目可能都用不上,建议只引入你需要的模块。
另外,Hutool 也有一个比较明显的缺点,很多功能实现的比较简单比如图片验证码、Excel 工具类,很可能无法满足项目的实际需求。像这样情况,还是建议你选择在某一方面更优秀的工具库比如 Excel 工具库 MyExcel、EasyExcel、图片处理库 Imglib
Hutool 实战
Hutool 的官方文档介绍的已经比较清晰了,奈何其提供的功能实在太多,我这里列举一些我个人觉得比较实用的功能,供大家学习参考。
引入依赖
Maven 仓库地址:https://mvnrepository.com/artifact/cn.hutool 。
这里为了方便,我们直接引入所有模块,实际项目中还是建议只引入自己需要的模块。
Maven:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
Gradle:
implementation 'cn.hutool:hutool-all:5.8.16'
除了这种引入方式之外,目前 Hutool 支持一种更优雅的引入方式,使用hutool-bom模块。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-bom</artifactId>
<version>5.8.32</version>
<type>pom</type>
<!-- 注意这里是import -->
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-http</artifactId>
</dependency>
</dependencies>
二、Hutool功能演示
1、类型转换
Convert类可以说是一个工具方法类,里面封装了针对Java常见类型的转换,用于简化类型转换。Convert类中大部分方法为toXXX,参数为Object,可以实现将任意可能的类型转换为指定类型。同时支持第二个参数defaultValue用于在转换失败时返回一个默认值。
long[] a = {2,2,4,555,51};
String aStr = Convert.toStr(a); //[2, 2, 4, 555, 51]
long b = 12 * 60 * 1000;
//转换时间单位
long minutes = Convert.convertTime(b, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);//12
double c = 123547.32;
//金额转为中文形式
String digitUppercase = Convert.digitToChinese(c);//壹拾贰万叁仟伍佰肆拾柒元叁角贰分
2、邮件
在 Java 中发送邮件主要品依靠 javax.mail 包,但是由于使用比较繁琐,因此 Hutool 针对其做了封装。
在 classpath(在标准 Maven 项目中为src/main/resources)的 config 目录下新建mail.setting文件,完整配置如下(邮件服务器必须支持并打开 SMTP 协议):
# 邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
host = smtp.yeah.net
# 邮件服务器的SMTP端口,可选,默认25
port = 25
# 发件人(必须正确,否则发送失败)
from =test1@foxmail.com
# 用户名,默认为发件人邮箱前缀
user = hutool
# 密码(注意,某些邮箱需要为SMTP服务单独设置授权码,详情查看相关帮助)
pass = q1w2e3
发送邮件非常简单:
MailUtil.send("test@foxmail.com", "测试", "邮件测试", false);
支持群发:
ArrayList<String> tos = CollUtil.newArrayList(
"test1@foxmail.com",
"test2@foxmail.com",
"test3@foxmail.com",
"test4@foxmail.com" );
MailUtil.send(tos, "测试", "邮件群发测试", false);
支持添加一个或者多个附件:
MailUtil.send("test@foxmail.com", "测试", "<h1>邮件测试</h1>", true, FileUtil.file("d:/aaa.xml"));
3、HTTP 请求工具类
针对最为常用的 GET 和 POST 请求,HttpUtil 封装了两个方法,
HttpUtil.get
HttpUtil.post
/ 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS
String result1= HttpUtil.get("https://www.baidu.com");
// 当无法识别页面编码的时候,可以自定义请求页面的编码
String result2= HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);
//可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("city", "北京");
String result3= HttpUtil.get("https://www.baidu.com", paramMap);
POST 请求:
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("city", "北京");
String result= HttpUtil.post("https://www.baidu.com", paramMap);
文件上传
HashMap<String, Object> paramMap = new HashMap<>();
//文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
paramMap.put("file", FileUtil.file("D:\\face.jpg"));
String result= HttpUtil.post("https://www.baidu.com", paramMap);
下载文件
因为Hutool-http机制问题,请求页面返回结果是一次性解析为byte[]的,如果请求URL返回结果太大(比如文件下载),那内存会爆掉,因此针对文件下载HttpUtil单独做了封装。文件下载在面对大文件时采用流的方式读写,内存中只是保留一定量的缓存,然后分块写入硬盘,因此大文件情况下不会对内存有压力。
String fileUrl = "http://mirrors.sohu.com/centos/8.4.2105/isos/x86_64/CentOS-8.4.2105-x86_64-dvd1.iso";
//将文件下载后保存在E盘,返回结果为下载文件大小
long size = HttpUtil.downloadFile(fileUrl, FileUtil.file("e:/"));
System.out.println("Download size: " + size);
当然,如果我们想感知下载进度,还可以使用另一个重载方法回调感知下载进度:
//带进度显示的文件下载
HttpUtil.downloadFile(fileUrl, FileUtil.file("e:/"), new StreamProgress(){
@Override
public void start() {
Console.log("开始下载。。。。");
}
@Override
public void progress(long progressSize) {
Console.log("已下载:{}", FileUtil.readableFileSize(progressSize));
}
@Override
public void finish() {
Console.log("下载完成!");
}
});
StreamProgress接口实现后可以感知下载过程中的各个阶段。
当然,工具类提供了一个更加抽象的方法:HttpUtil.download,此方法会请求URL,将返回内容写入到指定的OutputStream中。使用这个方法,可以更加灵活的将HTTP内容转换写出,以适应更多场景。
更多有用的工具方法
HttpUtil.encodeParams
对URL参数做编码,只编码键和值,提供的值可以是url附带参数,但是不能只是urlHttpUtil.toParams
和HttpUtil.decodeParams
两个方法是将Map参数转为URL参数字符串和将URL参数字符串转为Map对象HttpUtil.urlWithForm
是将URL字符串和Map参数拼接为GET请求所用的完整字符串使用HttpUtil.getMimeType
根据文件扩展名快速获取其MimeType(参数也可以是完整文件路径)
4、缓存
Hutool 提供了常见的几种缓存策略的实现:
-
FIFO(first in first out) :先进先出策略。
-
LFU(least frequently used) :最少使用率策略。
-
LRU(least recently used) :最近最久未使用策略。
-
TimedCache 定时缓存,对被缓存的对象定义一个过期时间,当对象超过过期时间会被清理。此缓存没有容量限制,对象只有在过期后才会被移除
-
WeakCache 弱引用缓存。对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除。该类使用了WeakHashMap做为其实现,缓存的清理依赖于JVM的垃圾回收。
-
FileCach 将小文件以 byte[] 的形式缓存到内容中,减少文件的访问,以解决频繁读取文件引起的性能问题。
5、加密解密
加密分为三种:
- 对称加密(symmetric),例如:AES、DES等
- 非对称加密(asymmetric),例如:RSA、DSA等
- 摘要加密(digest),例如:MD5、SHA-1、SHA-256、HMAC等
hutool-crypto针对这三种加密类型分别封装,并提供常用的大部分加密算法。
针对常用到的算法,模块还提供SecureUtil工具类用于快速实现加密。
方法介绍
- 对称加密
SecureUtil.aes
SecureUtil.des - 摘要算法
SecureUtil.md5
SecureUtil.sha1
SecureUtil.hmac
SecureUtil.hmacMd5
SecureUtil.hmacSha1 - 非对称加密
SecureUtil.rsa
SecureUtil.dsa
UUID
SecureUtil.simpleUUID 方法提供无“-”的UUID - 密钥生成
SecureUtil.generateKey 针对对称加密生成密钥
SecureUtil.generateKeyPair 生成密钥对(用于非对称加密)
SecureUtil.generateSignature 生成签名(用于非对称加密)
6、线程池
Hutool 支持使用建造者的模式创建自定义线程池,这样看着更加清晰。
private static ExecutorService pool = ExecutorBuilder.create()
.setCorePoolSize(10)//初始池大小
.setMaxPoolSize(20) //最大池大小
.setWorkQueue(new LinkedBlockingQueue<>(100))//最大等待数为100
.setThreadFactory(ThreadFactoryBuilder.create().setNamePrefix("IM-Pool-").build())// 线程池命名
.build();
实际项目中,如果一个对象的属性比较多,有限考虑使用建造者模式创建对象。
并且,Hutool 还提供一个全局的线程池,默认所有异步方法在这个线程池中执行。
ThreadUtil.execute : 直接在公共线程池中执行线程
ThreadUtil.execAsync: 执行异步方法
Hutool 自身就大量用到了 ThreadUtil,比如敏感词工具类 SensitiveUtil:
public static void init(final Collection<String> sensitiveWords, boolean isAsync){
if(isAsync){
// 异步初始化敏感词树
ThreadUtil.execAsync(new Callable<Boolean>(){
@Override
public Boolean call() throws Exception {
init(sensitiveWords);
return true;
}
});
}else{
// 同步初始化敏感词树
init(sensitiveWords);
}
}
。。。。。。
Hutool还有很多功能都非常实用比如字符工具类,jwt工具,时间的封装等,更多还请查阅官方网文档
https://hutool.cn/docs
三、相关地址
项目地址:https://github.com/dromara/hutool
官网:https://hutool.cn/