【Java猿猿必备】Hutool工具库开箱即用
Hutool 真心是一个不错的国产 Java 工具类库,功能全面,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行了封装,开箱即用!深受国内开发者的喜爱。目前确实是成为了国内使用最广的工具库之一了, Gitee 上的 Star 数也到了 23k +。
项目地址:https://github.com/dromara/hutool
官网:https://hutool.cn/
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);//12double 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.x
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(){@Overridepublic void start() {Console.log("开始下载。。。。");}@Overridepublic void progress(long progressSize) {Console.log("已下载:{}", FileUtil.readableFileSize(progressSize));}@Overridepublic void finish() {Console.log("下载完成!");}
});
StreamProgress接口实现后可以感知下载过程中的各个阶段。
当然,工具类提供了一个更加抽象的方法:HttpUtil.download,此方法会请求URL,将返回内容写入到指定的OutputStream中。使用这个方法,可以更加灵活的将HTTP内容转换写出,以适应更多场景。
更多有用的工具方法
-
HttpUtil.encodeParams
对URL参数做编码,只编码键和值,提供的值可以是url附带参数,但是不能只是url -
HttpUtil.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工具类用于快速实现加密。
方法介绍
-
加密解密
-
加密分为三种:
-
对称加密(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>(){@Overridepublic Boolean call() throws Exception {init(sensitiveWords);return true;}});}else{// 同步初始化敏感词树init(sensitiveWords);}
}
Hutool还有很多功能都非常实用比如字符工具类,jwt工具,时间的封装等.
更多还请查阅官方网文档https://hutool.cn/docs