实际工作中,我见过太多人满嘴代码质量,结果一看代码写得一团乱麻,言行极其不合一。
我之前其实是不太喜欢使用这种功能太多的工具类的,也比较担心稳定性和安全性,后面慢慢接受了就感觉其实也还好。而且,我们还可以按需只引入自己需要的功能模块,相对也比较灵活。
不过,Hutool 在兼容性方面确实做得差,不同版本 API 会有变化,这个确实有点坑的。
国内的开发者不太喜欢用 @Deprecated,正常的版本升级是循序渐进的。并且,同时提供新API并保留老API又不影响什么。
最终,总结一下是否值得用:
- 如果是个人项目,完全不用考虑太多,用就完事了。
- 如果是企业项目,考虑稳定性和兼容性,可以有限考虑Apache或者 Guava。如果更追求功能性,建议优先 Hutool。
如果是个人项目,完全不用考虑太多,用就完事了。
如果是企业项目,考虑稳定性和兼容性,可以有限考虑Apache或者 Guava。如果更追求功能性,建议优先 Hutool。
Hutool 真心是一个不错的国产 Java 工具类库,功能全面,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行了封装,开箱即用!
官方是这样介绍 Hutool 的:
Hutool 介绍
Hutool 包含的组件以及组件提供的功能如下表所示:
Hutool 包含的组件
你可以根据项目需求对每个模块单独引入,也可以通过引入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> ${hutool.version} </ version>
< type> pom </ type>
<!-- 注意这里是import -->
< scope> import </ scope>
</ dependency>
</ dependencies>
</ dependencyManagement>
在子模块中引入自己需要的模块了:
< dependencies>
< dependency>
< groupId> cn.hutool </ groupId>
< artifactId> hutool-http </ artifactId>
</ dependency>
</ dependencies>
功能演示
Hutool 提供的功能实在太多,这里只列举一些我个人觉得比较实用的功能,供大家学习参考。
类型转换
Convert 类封装了针对 Java 常见类型的转换。
long[] b = { 1, 2, 3, 4, 5};
String bStr = Convert.toStr(b); //"[1, 2, 3, 4, 5]"
longminutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES); //75
doublea = 67556.32;
String digitUppercase = Convert.digitToChinese(a); //"陆万柒仟伍佰伍拾陆元叁角贰分"
邮件
在 Java 中发送邮件主要品依靠 javax.mail 包,但是由于使用比较繁琐,因此 Hutool 针对其做了封装。
在 classpath(在标准 Maven 项目中为src/main/resources)的 config 目录下新建mail.setting文件,完整配置如下(邮件服务器必须支持并打开 SMTP 协议):
# 邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
host = smtp.yeah.net
# 邮件服务器的SMTP端口,可选,默认25
port = 25
# 发件人(必须正确,否则发送失败)
from =
# 用户名,默认为发件人邮箱前缀
user = hutool
# 密码(注意,某些邮箱需要为SMTP服务单独设置授权码,详情查看相关帮助)
pass = q1w2e3
发送邮件非常简单:
MailUtil.send( "", "测试", "邮件来自Hutool测试", false);
支持群发:
ArrayList<String> tos = CollUtil.newArrayList(
"",
"",
"",
"");
MailUtil.send(tos, "测试", "邮件来自Hutool群发测试", false);
支持添加一个或者多个附件:
MailUtil.send( "", "测试", "<h1>邮件来自Hutool测试</h1>", true, FileUtil.file( "d:/aaa.xml"));
除了使用配置文件定义全局账号以外,MailUtil.send方法同时提供重载方法可以传入一个MailAccount对象,这个对象为一个普通 Bean,记录了邮件服务器信息。
MailAccount account = newMailAccount;
account.setHost( "smtp.yeah.net");
account.setPort( "25");
account.setAuth( true);
account.setFrom( "");
account.setUser( "hutool");
account.setPass( "q1w2e3");
MailUtil.send(account, CollUtil.newArrayList( ""), "测试", "邮件来自Hutool测试", false);
唯一 ID
在分布式环境中,唯一 ID 生成应用十分广泛,生成方法也多种多样,Hutool 针对一些常用生成策略做了简单封装。
Hutool 提供的唯一 ID 生成器的工具类,涵盖了:
- UUID
- ObjectId(MongoDB)
- Snowflake(Twitter)
UUID
ObjectId(MongoDB)
Snowflake(Twitter)
UUID 是 Universally Unique Identifier(通用唯一标识符) 的缩写。UUID 包含 32 个 16 进制数字(8-4-4-4-12)。
Hutool 重写java.util.UUID的逻辑,对应类为cn.hutool.core.lang.UUID,使生成不带-的 UUID 字符串不再需要做字符替换,性能提升一倍左右。
String uuid = IdUtil.randomUUID;
//生成的是不带-的字符串,类似于:b17f24ff026d40949c85a24f4f375d42
String simpleUUID = IdUtil.simpleUUID;
ObjectId 是 MongoDB 数据库的一种唯一ID生成策略,是 UUID version1 的变种。
//生成类似:5b9e306a4df4f8c54a39fb0c
String id = ObjectId.next;
//方法2:从Hutool-4.1.14开始提供
String id2 = IdUtil.objectId;
Snowflake 是 Twitter 开源的分布式 ID 生成算法。
longid = IdUtil.getSnowflakeNextId;
String id = IdUtil.getSnowflakeNextIdStr;
HTTP 请求工具类
针对最为常用的 GET 和 POST 请求,HttpUtil 封装了两个方法,
- HttpUtil.get
- HttpUtil.post
HttpUtil.get
HttpUtil.post
GET 请求:
// 最简单的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 = newHashMap<>;
paramMap.put( "city", "北京");
String result3= HttpUtil.get( "https://www.baidu.com", paramMap);
POST 请求:
HashMap<String, Object> paramMap = newHashMap<>;
paramMap.put( "city", "北京");
String result= HttpUtil.post( "https://www.baidu.com", paramMap);
文件上传:
HashMap<String, Object> paramMap = newHashMap<>;
//文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
paramMap.put( "file", FileUtil.file( "D:\face.jpg"));
String result= HttpUtil.post( "https://www.baidu.com", paramMap);
缓存
Hutool 提供了常见的几种缓存策略的实现:
- FIFO(first in first out):先进先出策略。
- LFU(least frequently used):最少使用率策略。
- LRU(least recently used):最近最久未使用策略。
- Timed:定时策略。
- Weak:弱引用策略。
FIFO(first in first out):先进先出策略。
LFU(least frequently used):最少使用率策略。
LRU(least recently used):最近最久未使用策略。
Timed:定时策略。
Weak:弱引用策略。
并且,Hutool 还支持将小文件以 byte[] 的形式缓存到内容中,减少文件的访问,以解决频繁读取文件引起的性能问题。
FIFO(first in first out) 策略缓存使用:
Cache<String,String> fifoCache = CacheUtil.newFIFOCache( 3);
//加入元素,每个元素可以设置其过期时长,DateUnit.SECOND.getMillis代表每秒对应的毫秒数,在此为3秒
fifoCache.put( "key1", "value1", DateUnit.SECOND.getMillis * 3);
fifoCache.put( "key2", "value2", DateUnit.SECOND.getMillis * 3);
fifoCache.put( "key3", "value3", DateUnit.SECOND.getMillis * 3);
//由于缓存容量只有3,当加入第四个元素的时候,根据FIFO规则,最先放入的对象将被移除
fifoCache.put( "key4", "value4", DateUnit.SECOND.getMillis * 3);
//value1为null
String value1 = fifoCache.get( "key1");
控制台打印封装
一般情况下,我们打印信息到控制台小伙伴们应该再熟悉不过了!
System.out.println( "Hello World");
但是,这种方式不满足很多场景的需要:
- 不支持参数,对象打印需要拼接字符串
- 不能直接打印数组,需要手动调用 Arrays.toString
不支持参数,对象打印需要拼接字符串
不能直接打印数组,需要手动调用 Arrays.toString
为此,Hutool 封装了Console对象。
Console对象的使用更加类似于 Java 的console.log方法,这也是借鉴了 JS 的一个语法糖。
Console对象的使用更加类似于 Java 的console.log方法,这也是借鉴了 JS 的一个语法糖。
Console.log(a); //控制台输出:[java, c++, c]
Console.log( "This is Console log for {}.", "test"); //控制台输出:This is Console log for test.
布隆过滤器// 初始化布隆过滤器
BitMapBloomFilter filter = newBitMapBloomFilter( 10);
filter.add( "123");
filter.add( "abc");
filter.add( "ddd");
// 查找元素
filter.contains( "abc");
加密解密
Hutool 支持对称加密、非对称加密、摘要加密、消息认证码算法、国密。
这里以国密为例,Hutool 针对Bouncy Castle做了简化包装,用于实现国密算法中的 SM2、SM3、SM4。
国密算法需要引入Bouncy Castle库的依赖:
< dependency>
< groupId> org.bouncycastle </ groupId>
< artifactId> bcprov-jdk15to18 </ artifactId>
< version> 1.69 </ version>
</ dependency>
SM2 使用自定义密钥对加密或解密:
String text = "JavaGuide:一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!";
System.out.println( "原文:"+ text);
KeyPair pair = SecureUtil.generateKeyPair( "SM2");
// 公钥
byte[] privateKey = pair.getPrivate.getEncoded;
// 私钥
byte[] publicKey = pair.getPublic.getEncoded;
SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
// 公钥加密,私钥解密
String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
System.out.println( "加密后:"+ encryptStr);
String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
System.out.println( "解密后:"+ decryptStr);
SM2 签名和验签:
//加签
String sign = sm2.signHex(HexUtil.encodeHexStr(text));
System.out.println( "签名:"+ sign);
//验签
booleanverify = sm2.verifyHex(HexUtil.encodeHexStr(text), sign);
System.out.println( "验签:"+ verify);
输出结果:
线程池
Hutool 支持使用建造者的模式创建自定义线程池,这样看着更加清晰。
privatestaticExecutorService pool = ExecutorBuilder.create
.setCorePoolSize( 10) //初始池大小
.setMaxPoolSize( 20) //最大池大小
.setWorkQueue( newLinkedBlockingQueue<>( 100)) //最大等待数为100
.setThreadFactory(ThreadFactoryBuilder.create.setNamePrefix( "IM-Pool-").build) // 线程池命名
.build;
实际项目中,如果一个对象的属性比较多,有限考虑使用建造者模式创建对象。
并且,Hutool 还提供一个全局的线程池,默认所有异步方法在这个线程池中执行。
- ThreadUtil.execute : 直接在公共线程池中执行线程
- ThreadUtil.execAsync: 执行异步方法
- ……
ThreadUtil.execute : 直接在公共线程池中执行线程
ThreadUtil.execAsync: 执行异步方法
……
Hutool 自身就大量用到了 ThreadUtil,比如敏感词工具类 SensitiveUtil:
publicstaticvoidinit( finalCollection<String> sensitiveWords, booleanisAsync) {
if(isAsync){
// 异步初始化敏感词树
ThreadUtil.execAsync( newCallable<Boolean>{
@Override
publicBoolean callthrowsException {
init(sensitiveWords);
returntrue;
}
});
} else{
// 同步初始化敏感词树
init(sensitiveWords);
}
}
相关地址
- 项目地址: https://github.com/dromara/hutool
- 官网: https://hutool.cn/
项目地址: https://github.com/dromara/hutool
官网: https://hutool.cn/
到此这篇hutool的dateutil工具类(dateutils 工具类)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/60714.html