引入 Hutool
Maven 项目只需要在 pom.xml 文件中添加以下依赖即可。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.3</version>
</dependency>
Hutool 的设计思想是尽量减少重复的定义,让项目中的 util 包尽量少。一个好的轮子可以在很大程度上避免“复制粘贴”,从而节省我们开发人员对项目中公用类库和公用工具方法的封装时间。
Hutool 对不仅对 JDK 底层的文件、流、加密解密、转码、正则、线程、XML等做了封装,还提供了以下这些组件:![](https://i-blog.csdnimg.cn/direct/35bc42a28ea6408982fa24930c3252ad.png)
类型转换
类型转换在 Java 开发中很常见,尤其是从 HttpRequest 中获取参数的时候,前端传递的是整型,但后端只能先获取到字符串,然后再调用
parseXXX()
方法进行转换,还要加上判空,很繁琐。
Hutool 的 Convert 类可以简化这个操作,可以将任意可能的类型转换为指定类型,同时第二个参数 defaultValue 可用于在转换失败时返回一个默认值。
String param = "10";
int paramInt = Convert.toInt(param);
int paramIntDefault = Convert.toInt(param, 0);
把字符串转换成日期:
String dateStr = "2020年09月29日";
Date date = Convert.toDate(dateStr);
把字符串转成 Unicode:
String unicodeStr = "沉默王二";
String unicode = Convert.strToUnicode(unicodeStr);
日期时间
获取当前日期:
Date date = DateUtil.date();
DateUtil.date()
返回的其实是 DateTime,它继承自 Date 对象,重写了
toString()
方法,返回
yyyy-MM-dd HH:mm:ss
格式的字符串。
字符串转日期:
String dateStr = "2020-09-29";
Date date = DateUtil.parse(dateStr);
DateUtil.parse()
会自动识别一些常用的格式,比如说:
- yyyy-MM-dd HH:mm:ss
- yyyy-MM-dd
- HH:mm:ss
- yyyy-MM-dd HH:mm
- yyyy-MM-dd HH:mm:ss.SSS
还可以识别带中文的:
- 年月日时分秒
格式化时间差:
String dateStr1 = "2020-09-29 22:33:23";
Date date1 = DateUtil.parse(dateStr1);
String dateStr2 = "2020-10-01 23:34:27";
Date date2 = DateUtil.parse(dateStr2);
long betweenDay = DateUtil.between(date1, date2, DateUnit.MS);
// 输出:2天1小时1分4秒
String formatBetween = DateUtil.formatBetween(betweenDay, BetweenFormater.Level.SECOND);
星座和属相:
// 射手座
String zodiac = DateUtil.getZodiac(Month.DECEMBER.getValue(), 10);
// 蛇
String chineseZodiac = DateUtil.getChineseZodiac(1989);
IO 流相关
IO操作包括读和写,应用的场景主要包括网络操作和文件操作,原生的 Java 类库区分字符流和字节流,字节流 InputStream 和 OutputStream 就有很多很多种,使用起来让人头皮发麻。
Hutool 封装了流操作工具类 IoUtil、文件读写操作工具类 FileUtil、文件类型判断工具类 FileTypeUtil 等等
BufferedInputStreamin= FileUtil.getInputStream("hutool/origin.txt");
BufferedOutputStreamout= FileUtil.getOutputStream("hutool/to.txt");
longcopySize= IoUtil.copy(in, out, IoUtil.DEFAULT_BUFFER_SIZE);
在 IO 操作中,文件的操作相对来说是比较复杂的,但使用频率也很高,几乎所有的项目中都躺着一个叫 FileUtil 或者 FileUtils 的工具类。Hutool 的 FileUtil 类包含以下几类操作:
- 文件操作:包括文件目录的新建、删除、复制、移动、改名等
- 文件判断:判断文件或目录是否非空,是否为目录,是否为文件等等
- 绝对路径:针对 ClassPath 中的文件转换为绝对路径文件
- 文件名:主文件名,扩展名的获取
- 读操作:包括 getReader、readXXX 操作
- 写操作:包括 getWriter、writeXXX 操作
字符串工具
Hutool 封装的字符串工具类 StrUtil 和 Apache Commons Lang 包中的 StringUtils 类似。不过,我倒是挺喜欢其中的一个方法的:
Stringtemplate="{},一枚沉默但有趣的程序员,他的朋友是{}";
Stringstr= StrUtil.format(template, "张三", "李四");
// 张三,一枚沉默但有趣的程序员,他的朋友是李四
反射工具
反射机制可以让 Java 变得更加灵活,因此在某些情况下,反射可以做到事半功倍的效果。Hutool 封装的反射工具 ReflectUtil 包括:
- 获取构造方法
- 获取字段
- 获取字段值
- 获取方法
- 执行方法(对象方法和静态方法)
package com.itwanger.hutool.reflect;
import cn.hutool.core.util.ReflectUtil;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
publicclassReflectDemo {
privateint id;
publicReflectDemo() {
System.out.println("构造方法");
}
publicvoidprint() {
System.out.println("我是沉默王二");
}
publicstaticvoidmain(String[] args)throws IllegalAccessException {
// 构建对象ReflectDemoreflectDemo= ReflectUtil.newInstance(ReflectDemo.class);
// 获取构造方法
Constructor[] constructors = ReflectUtil.getConstructors(ReflectDemo.class);
for (Constructor constructor : constructors) {
System.out.println(constructor.getName());
}
// 获取字段Fieldfield= ReflectUtil.getField(ReflectDemo.class, "id");
field.setInt(reflectDemo, 10);
// 获取字段值
System.out.println(ReflectUtil.getFieldValue(reflectDemo, field));
// 获取所有方法
Method[] methods = ReflectUtil.getMethods(ReflectDemo.class);
for (Method m : methods) {
System.out.println(m.getName());
}
// 获取指定方法Methodmethod= ReflectUtil.getMethod(ReflectDemo.class, "print");
System.out.println(method.getName());
// 执行方法
ReflectUtil.invoke(reflectDemo, "print");
}
}
压缩工具
在 Java 中,对文件、文件夹打包压缩是一件很繁琐的事情,Hutool 封装的 ZipUtil 针对 java.util.zip 包做了优化,可以使用一个方法搞定压缩和解压,并且自动处理文件和目录的问题,不再需要用户判断,大大简化的压缩解压的复杂度。
ZipUtil.zip("hutool", "hutool.zip");
File unzip = ZipUtil.unzip("hutool.zip", "hutoolzip");
身份证工具
Hutool 封装的 IdcardUtil 可以用来对身份证进行验证,支持大陆 15 位、18 位身份证,港澳台 10 位身份证。
String ID_18 = "321083197812162119";
String ID_15 = "150102880730303";
boolean valid = IdcardUtil.isValidCard(ID_18);
boolean valid15 = IdcardUtil.isValidCard(ID_15);
缓存工具
- FIFOCache:先入先出,元素不停的加入缓存直到缓存满为止,当缓存满时,清理过期缓存对象,清理后依旧满则删除先入的缓存。
Cache<String, String> fifoCache = CacheUtil.newFIFOCache(3);fifoCache.put("key1", "沉默王一");fifoCache.put("key2", "沉默王二");fifoCache.put("key3", "沉默王三");fifoCache.put("key4", "沉默王四");// 大小为 3,所以 key3 放入后 key1 被清除String value1 = fifoCache.get("key1");
- LFUCache:最少使用,根据使用次数来判定对象是否被持续缓存,当缓存满时清理过期对象,清理后依旧满的情况下清除最少访问的对象并将其他对象的访问数减去这个最少访问数,以便新对象进入后可以公平计数。
Cache<String, String> lfuCache = CacheUtil.newLFUCache(3);lfuCache.put("key1", "沉默王一");// 使用次数+1lfuCache.get("key1");lfuCache.put("key2", "沉默王二");lfuCache.put("key3", "沉默王三");lfuCache.put("key4", "沉默王四");// 由于缓存容量只有 3,当加入第 4 个元素的时候,最少使用的将被移除(2,3被移除)String value2 = lfuCache.get("key2");String value3 = lfuCache.get("key3");
- LRUCache,最近最久未使用,根据使用时间来判定对象是否被持续缓存,当对象被访问时放入缓存,当缓存满了,最久未被使用的对象将被移除。
Cache<String, String> lruCache = CacheUtil.newLRUCache(3);lruCache.put("key1", "沉默王一");lruCache.put("key2", "沉默王二");lruCache.put("key3", "沉默王三");// 使用时间近了lruCache.get("key1");lruCache.put("key4", "沉默王四");// 由于缓存容量只有 3,当加入第 4 个元素的时候,最久使用的将被移除(2)String value2 = lruCache.get("key2");System.out.println(value2);
加密解密
加密分为三种:
- 对称加密(symmetric),例如:AES、DES 等
- 非对称加密(asymmetric),例如:RSA、DSA 等
- 摘要加密(digest),例如:MD5、SHA-1、SHA-256、HMAC 等
Hutool 针对这三种情况都做了封装:
- 对称加密 SymmetricCrypto
- 非对称加密 AsymmetricCrypto
- 摘要加密 Digester
快速加密工具类 SecureUtil 有以下这些方法:
1)对称加密
- SecureUtil.aes
- SecureUtil.des
2)非对称加密
- SecureUtil.rsa
- SecureUtil.dsa
3)摘要加密
- SecureUtil.md5
- SecureUtil.sha1
- SecureUtil.hmac
- SecureUtil.hmacMd5
- SecureUtil.hmacSha1
public class SecureUtilDemo {
static AES aes = SecureUtil.aes();
public static void main(String[] args) {
String encry = aes.encryptHex("沉默王二");
System.out.println(encry);
String oo = aes.decryptStr(encry);
System.out.println(oo);
}
}
版权归原作者 日常记录者 所有, 如有侵权,请联系我们删除。