当前位置:网站首页 > 编程语言 > 正文

hutool的dateutil工具类(dateutils 工具类)



实际工作中,我见过太多人满嘴代码质量,结果一看代码写得一团乱麻,言行极其不合一。

我之前其实是不太喜欢使用这种功能太多的工具类的,也比较担心稳定性和安全性,后面慢慢接受了就感觉其实也还好。而且,我们还可以按需只引入自己需要的功能模块,相对也比较灵活。

不过,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 提供了常见的几种缓存策略的实现:

  1. FIFO(first in first out):先进先出策略。
  2. LFU(least frequently used):最少使用率策略。
  3. LRU(least recently used):最近最久未使用策略。
  4. Timed:定时策略。
  5. 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");

但是,这种方式不满足很多场景的需要:

  1. 不支持参数,对象打印需要拼接字符串
  2. 不能直接打印数组,需要手动调用 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 工具类)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 圈一圈,算一算(小学一年级数学题圈一圈算一算)2025-03-13 18:00:10
  • 若依文档(若依文档工具)2025-03-13 18:00:10
  • 工具类品牌排行前十(工具类品牌排行前十有哪些)2025-03-13 18:00:10
  • 社会阶级阶层结构划分标准(社会阶层的划分标准有哪些)2025-03-13 18:00:10
  • 卡巴斯基更新源地址(卡巴斯基如何更新版本)2025-03-13 18:00:10
  • ad009原理图(ad9959原理图)2025-03-13 18:00:10
  • yum 命令(安装yum命令)2025-03-13 18:00:10
  • 反编译exe文件(反编译 exe)2025-03-13 18:00:10
  • spss25和26(spss25和26的分析结果会查一点点吗)2025-03-13 18:00:10
  • 字符串转换器(字符串 转换)2025-03-13 18:00:10
  • 全屏图片