不要再重复造轮⼦了,Hutool这款开源⼯具类库贼好使
读者⾥有个⼩伙伴感慨说,“Hutool 这款开源类库太厉害了,基本上该有该的⼯具类,它⾥⾯都有。”讲真的,我平常⼯作中也经常⽤ Hutool,它确实可以帮助我们简化每⼀⾏代码,使 Java 拥有函数式语⾔般的优雅,让 Java 语⾔变得“甜甜的”。
PS:为了能够帮助更多的 Java 爱好者,已将《Java 程序员进阶之路》开源到了 GitHub(本篇已收录)。该专栏⽬前已经收获了 598 枚星标,如果你也喜欢这个专栏,觉得有帮助的话,可以去点个 star,这样也⽅便以后进⾏更系统化的学习!
Hutool 的作者在官⽹上说,Hutool 是 Hu+tool 的⾃造词(好像不⽤说,我们也能猜得到),“Hu”⽤来致敬他的“前任”公司,“tool”就是⼯具的意思,谐⾳就有意思了,“糊涂”,寓意追求“万事都作糊涂观,⽆所谓失,⽆所谓得”(⼀个开源类库,上升到了哲学的⾼度,作者厉害了)。
看了⼀下开发团队的⼀个成员介绍,⼀个 Java 后端⼯具的作者竟然爱前端、爱数码,爱美⼥,嗯嗯嗯,确实“难得糊
涂”(⼿动狗头)。
废话就说到这,来吧,实操⾛起!
01、引⼊ Hu t o o l
Maven 项⽬只需要在 l ⽂件中添加以下依赖即可。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.3</version>
</dependency>
Hutool 的设计思想是尽量减少重复的定义,让项⽬中的 util 包尽量少。⼀个好的轮⼦可以在很⼤程度上避免“复制粘贴”,从⽽节省我们开发⼈员对项⽬中公⽤类库和公⽤⼯具⽅法的封装时间。同时呢,成熟的开源库也可以最⼤限度的避免封装不完善带来的 bug。
就像作者在官⽹上说的那样:
以前,我们打开搜索引擎 -> 搜“Java MD5 加密” -> 打开某篇博客 -> 复制粘贴 -> 改改,变得好⽤些
有了 Hutool 以后呢,引⼊ Hutool -> 直接 SecureUtil.md5()
Hutool 对不仅对 JDK 底层的⽂件、流、加密解密、转码、正则、线程、XML等做了封装,还提供了以下这些组件:
⾮常多,⾮常全⾯,鉴于此,我只挑选⼀些我喜欢的来介绍下(偷偷地告诉你,我就是想偷懒)。
02、类型转换
类型转换在 Java 开发中很常见,尤其是从 HttpRequest 中获取参数的时候,前端传递的是整形,但后端只能先获取到字符串,然后再调⽤ parseXXX() ⽅法进⾏转换,还要加上判空,很繁琐。
Hutool 的 Convert 类可以简化这个操作,可以将任意可能的类型转换为指定类型,同时第⼆个参数 defaultValue 可⽤于在转换失败时返回⼀个默认值。
String param = "10";
int paramInt = Int(param);
int paramIntDefault = Int(param, 0);
把字符串转换成⽇期:
String dateStr = "2020年09⽉29⽇";
Date date = Date(dateStr);
把字符串转成 Unicode:
String unicodeStr = "沉默王⼆";
String unicode = Convert.strToUnicode(unicodeStr);
03、⽇期时间
JDK ⾃带的 Date 和 Calendar 不太好⽤,Hutool 封装的 DateUtil ⽤起来就舒服多了!
获取当前⽇期:unicode在线工具
Date date = DateUtil.date();
DateUtil.date() 返回的其实是 DateTime,它继承⾃ Date 对象,重写了 toString() ⽅法,返回 yyyy-MM-dd HH:mm:ss 格式的字符串。
有些⼩伙伴是不是想看看我写这篇⽂章的时间,输出⼀下给⼤家看看:
System.out.println(date);// 2020-09-29 04:28:02
字符串转⽇期:
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 = Zodiac(Value(), 10);
// 蛇
String chineseZodiac = ChineseZodiac(1989);
04、IO流相关
IO 操作包括读和写,应⽤的场景主要包括⽹络操作和⽂件操作,原⽣的 Java 类库区分字符流和字节流,字节流
InputStream 和 OutputStream 就有很多很多种,使⽤起来让⼈头⽪发⿇。
Hutool 封装了流操作⼯具类 IoUtil、⽂件读写操作⼯具类 FileUtil、⽂件类型判断⼯具类 FileTypeUtil 等等。BufferedInputStream in = InputStream("");
BufferedOutputStream out = OutputStream("");
long copySize = py(in, out, IoUtil.DEFAULT_BUFFER_SIZE);
在 IO 操作中,⽂件的操作相对来说是⽐较复杂的,但使⽤频率也很⾼,⼏乎所有的项⽬中都躺着⼀个叫 FileUtil 或者FileUtils 的⼯具类。Hutool 的 FileUtil 类包含以下⼏类操作:
⽂件操作:包括⽂件⽬录的新建、删除、复制、移动、改名等
⽂件判断:判断⽂件或⽬录是否⾮空,是否为⽬录,是否为⽂件等等
绝对路径:针对 ClassPath 中的⽂件转换为绝对路径⽂件
⽂件名:主⽂件名,扩展名的获取
读操作:包括 getReader、readXXX 操作
写操作:包括 getWriter、writeXXX 操作
顺带说说 classpath。
在实际编码当中,我们通常需要从某些⽂件⾥⾯读取⼀些数据,⽐如配置⽂件、⽂本⽂件、图⽚等等,那这些⽂件通常放在什么位置呢?
放在项⽬结构图中的 resources ⽬录下,当项⽬编译后,会出现在 classes ⽬录下。对应磁盘上的⽬
录如下图所⽰:
当我们要读取⽂件的时候,我是不建议使⽤绝对路径的,因为操作系统不⼀样的话,⽂件的路径标识符也是不⼀样的。最好使⽤相对路径。
假设在 src/resources 下放了⼀个⽂件 ,⽂件的路径参数如下所⽰:
假设⽂件放在 src/resources/hutool ⽬录下,则路径参数改为:
05、字符串⼯具
Hutool 封装的字符串⼯具类 StrUtil 和 Apache Commons Lang 包中的 StringUtils 类似,作者认为优势在于 Str ⽐String 短,尽管我不觉得。不过,我倒是挺喜欢其中的⼀个⽅法的:
String template = "{},⼀枚沉默但有趣的程序员,喜欢他的⽂章的话,请搜索{}";
String str = StrUtil.format(template, "沉默王⼆", "沉默王⼆");
// 沉默王⼆,⼀枚沉默但有趣的程序员,喜欢他的⽂章的话,请搜索沉默王⼆
06、反射⼯具
反射机制可以让 Java 变得更加灵活,因此在某些情况下,反射可以做到事半功倍的效果。Hutool 封装的反射⼯具ReflectUtil 包括:
获取构造⽅法
获取字段
获取字段值
获取⽅法
执⾏⽅法(对象⽅法和静态⽅法)
package com.flect;
import util.ReflectUtil;
import flect.Constructor;
import flect.Field;
import flect.Method;
public class ReflectDemo {
private int id;
public ReflectDemo() {
System.out.println("构造⽅法");
}
public void print() {
System.out.println("我是沉默王⼆");
}
public static void main(String[] args) throws IllegalAccessException {
/
/ 构建对象
ReflectDemo reflectDemo = wInstance(ReflectDemo.class);
// 获取构造⽅法
Constructor[] constructors = Constructors(ReflectDemo.class);
for (Constructor constructor : constructors) {
System.out.Name());
}
// 获取字段
Field field = Field(ReflectDemo.class, "id");
field.setInt(reflectDemo, 10);
// 获取字段值
System.out.FieldValue(reflectDemo, field));
// 获取所有⽅法
Method[] methods = Methods(ReflectDemo.class);
for (Method m : methods) {
System.out.Name());
}
// 获取指定⽅法
Method method = Method(ReflectDemo.class, "print");
System.out.Name());
// 执⾏⽅法
ReflectUtil.invoke(reflectDemo, "print");
}
}
07、压缩⼯具
在 Java 中,对⽂件、⽂件夹打包压缩是⼀件很繁琐的事情,Hutool 封装的 ZipUtil 针对 java.util.zip 包做了优化,可以使⽤⼀个⽅法搞定压缩和解压,并且⾃动处理⽂件和⽬录的问题,不再需要⽤户判断,⼤⼤简化的压缩解压的复杂度。ZipUtil.zip("hutool", "hutool.zip");
File unzip = ZipUtil.unzip("hutool.zip", "hutoolzip");
08、⾝份证⼯具
Hutool 封装的 IdcardUtil 可以⽤来对⾝份证进⾏验证,⽀持⼤陆 15 位、18 位⾝份证,港澳台 10 位⾝份证。
String ID_18 = "321083************";
String ID_15 = "150102*********";
boolean valid = IdcardUtil.isValidCard(ID_18);
boolean valid15 = IdcardUtil.isValidCard(ID_15);
09、扩展 Ha sh Ma p
Java 中的 HashMap 是强类型的,⽽ Hutool 封装的 Dict 对键的类型要求没那么严格。
Dict dict = ate()
.set("age", 18)
.set("name", "沉默王⼆")
.set("birthday", w());
int age = Int("age");
String name = Str("name");
10、控制台打印
本地编码的过程中,经常需要使⽤ System.out 打印结果,但是往往⼀些复杂的对象不⽀持直接打印,⽐如说数组,需要调⽤String。Hutool 封装的 Console 类借鉴了 JavaScript 中的 console.log(),使得打印变成了⼀个⾮常便捷的⽅式。
public class ConsoleDemo {
public static void main(String[] args) {
// 打印字符串
Console.log("沉默王⼆,⼀枚有趣的程序员");
// 打印字符串模板
Console.log("洛阳是{}朝古都",13);
int [] ints = {1,2,3,4};
// 打印数组
Console.log(ints);
}
}
11、字段验证器
做 Web 开发的时候,后端通常需要对表单提交过来的数据进⾏验证。Hutool 封装的 Validator 可以进⾏很多有效的条件验证:
是不是邮箱
是不是 IP V4、V6
是不是电话号码
等等
Validator.isEmail("沉默王⼆");
Validator.isMobile("itwanger");
12、双向查 Ma p
Guava 中提供了⼀种特殊的 Map 结构,叫做 BiMap,实现了⼀种双向查的功能,可以根据 key 查 value,也可以根据 value 查 key,Hutool 也提供这种 Map 结构。
BiMap<String, String> biMap = new BiMap<>(new HashMap<>());
biMap.put("wanger", "沉默王⼆");
biMap.put("wangsan", "沉默王三");
// get value by key
<("wanger");
<("wangsan");
// get key by value
在实际的开发⼯作中,其实我更倾向于使⽤ Guava 的 BiMap,⽽不是 Hutool 的。这⾥提⼀下,主要是我发现了 Hutool 在线⽂档上的⼀处错误,提了个 issue(从中可以看出我⼀颗⼀丝不苟的⼼和⼀双清澈明亮的⼤眼睛啊)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论