读者群里有个小伙伴感慨说,“Hutool 这款开源类库太厉害了,基本上该有该的工具类,它里面都有。”讲真的,我平常工作中也经常用 Hutool,它确实可以帮助我们简化每一行代码,使 Java 拥有函数式语言般的优雅,让 Java 语言变得“甜甜的”。
PS:为了能够帮助更多的 Java 爱好者,已将《Java 程序员进阶之路》开源到了 GitHub(本篇已收录)。该专栏目前已经收获了 598 枚星标,如果你也喜欢这个专栏,觉得有帮助的话,可以去点个 star,这样也方便以后进行更系统化的学习!
https://github.com/itwanger/toBeBetterJavaer
Hutool 的作者在官网上说,Hutool 是 Hu+tool 的自造词(好像不用说,我们也能猜得到),“Hu”用来致敬他的“前任”公司,“tool”就是工具的意思,谐音就有意思了,“糊涂”,寓意追求“万事都作糊涂观,无所谓失,无所谓得”(一个开源类库,上升到了哲学的高度,作者厉害了)。
看了一下开发团队的一个成员介绍,一个 Java 后端工具的作者竟然爱前端、爱数码,爱美女,嗯嗯嗯,确实“难得糊涂”(手动狗头)。
废话就说到这,来吧,实操走起!
01、引入 Hutool
Maven 项目只需要在 pom.xml 文件中添加以下依赖即可。
<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 = 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);
03、日期时间
JDK 自带的 Date 和 Calendar 不太好用,Hutool 封装的 DateUtil 用起来就舒服多了!
获取当前日期:
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 = DateUtil.getZodiac(Month.DECEMBER.getValue(), 10); // 蛇 String chineseZodiac = DateUtil.getChineseZodiac(1989);
04、IO 流相关
IO 操作包括读和写,应用的场景主要包括网络操作和文件操作,原生的 Java 类库区分字符流和字节流,字节流 InputStream 和 OutputStream 就有很多很多种,使用起来让人头皮发麻。
Hutool 封装了流操作工具类 IoUtil、文件读写操作工具类 FileUtil、文件类型判断工具类 FileTypeUtil 等等。
BufferedInputStream in = FileUtil.getInputStream("hutool/origin.txt");
BufferedOutputStream out = FileUtil.getOutputStream("hutool/to.txt");
long copySize = IoUtil.copy(in, out, IoUtil.DEFAULT_BUFFER_SIZE);
在 IO 操作中,文件的操作相对来说是比较复杂的,但使用频率也很高,几乎所有的项目中都躺着一个叫 FileUtil 或者 FileUtils 的工具类。Hutool 的 FileUtil 类包含以下几类操作:
文件操作:包括文件目录的新建、删除、复制、移动、改名等
文件判断:判断文件或目录是否非空,是否为目录,是否为文件等等
绝对路径:针对 ClassPath 中的文件转换为绝对路径文件
文件名:主文件名,扩展名的获取
读操作:包括 getReader、readXXX 操作
写操作:包括 getWriter、writeXXX 操作