Java工具类强推:Hutool
官方文档: https://www.hutool.cn/docs/#/
Github地址: https://github.com/dromara/hutool
Gitee地址: https://gitee.com/dromara/hutool
❓背景
灵魂拷问1:还在为新项目工具类搬迁而烦恼?
灵魂拷问2:还在为项目中工具类维护而烦恼?
📘简述
Hutool
它是一个Java工具集类库,包含了很多静态方法的封装:流处理、时间日期处理、正则处理、加解密处理、文件处理、集合处理等,可以说是项目中几乎所有XxxxUtil的替代品,它可以使你更多的关注代码逻辑,优雅的写出高效代码,避免“复制粘贴,改改再战”。
🛠️组件
模块划分预览,可以根据需求对每个模块单独引入,也可以通过引入hutool-all
方式引入所有模块。
介绍 | |
---|---|
hutool-aop | JDK动态代理封装,提供非IOC下的切面支持 |
hutool-bloomFilter | 布隆过滤,提供一些Hash算法的布隆过滤 |
hutool-cache | 简单缓存实现 |
hutool-core | 核心,包括Bean操作、日期、各种Util等 |
hutool-cron | 定时任务模块,提供类Crontab表达式的定时任务 |
hutool-crypto | 加密解密模块,提供对称、非对称和摘要算法封装 |
hutool-db | JDBC封装后的数据操作,基于ActiveRecord思想 |
hutool-dfa | 基于DFA模型的多关键字查找 |
hutool-extra | 扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等) |
hutool-http | 基于HttpUrlConnection的Http客户端封装 |
hutool-log | 自动识别日志实现的日志门面 |
hutool-script | 脚本执行封装,例如Javascript |
hutool-setting | 功能更强大的Setting配置文件和Properties封装 |
hutool-system | 系统参数调用封装(JVM信息等) |
hutool-json | JSON实现 |
hutool-captcha | 图片验证码实现 |
hutool-poi | 针对POI中Excel和Word的封装 |
hutool-socket | 基于Java的NIO和AIO的Socket封装 |
hutool-jwt | JSON Web Token (JWT)封装实现 |
☀️常用
⚠️只列举部分方法,详细可查看源码学习!!!
1、核心工具集
1.1、日期时间工具-DateUtil
日期转换再常用不过了,字符串转日期格式、日期格式转指定字符串格式、获取当前系统日期、时间差
// 自定义日期格式转化
String dateStr = "2017-03-01";
Date date = DateUtil.parse(dateStr, "yyyy-MM-dd");
1.2、农历日期-ChineseDate
提供了生肖、天干地支、传统节日等方法。
//通过公历构建
ChineseDate date = new ChineseDate(DateUtil.parseDate("2020-01-25"));
// 一月
date.getChineseMonth();
// 正月
date.getChineseMonthName();
// 初一
date.getChineseDay();
// 庚子
date.getCyclical();
// 生肖:鼠
date.getChineseZodiac();
// 传统节日(部分支持,逗号分隔):春节
date.getFestivals();
// 庚子鼠年 正月初一
date.toString();
1.3、计时器工具-TimeInterval
计算方法或过程执行的时间,支持分组计时,方便对比时间
TimeInterval timer = DateUtil.timer();
//---------------------------------
//-------这是执行过程
//---------------------------------
timer.interval();//花费毫秒数
timer.intervalRestart();//返回花费时间,并重置开始时间
timer.intervalMinute();//花费分钟数
1.4、文件类型判断-FileTypeUtil
在文件上传时,有时候我们需要判断文件类型。但是又不能简单的通过扩展名来判断(防止恶意脚本等通过上传到服务器上),于是我们需要在服务端通过读取文件的首部几个二进制位来判断常用的文件类型。
File file = FileUtil.file("d:/test.jpg");
String type = FileTypeUtil.getType(file);
//输出 jpg则说明确实为jpg文件
Console.log(type);
1.5、符串工具-StrUtil
这个工具的用处类似于Apache Commons Lang中的StringUtil,字符串判空操作就不再累述,StrUtil只做增强:sub、removePrefix、removeSuffix
// 去掉字符串的后缀,例如去个文件名的扩展名。
String fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg") //fileName -> pretty_girl
1.6、16进制工具-HexUtil
16进制一般针对无法显示的一些二进制进行显示,常用于: 1、图片的字符串表现形式 2、加密解密 3、编码转换
String str = "我是一个字符串";
String hex = HexUtil.encodeHexStr(str, CharsetUtil.CHARSET_UTF_8);
//hex是:
//e68891e698afe4b880e4b8aae5ad97e7aca6e4b8b2
String decodedStr = HexUtil.decodeHexStr(hex);
//解码后与str相同
1.7、Escape工具-EscapeUtil
转义和反转义工具类Escape / Unescape。escape采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。此类中的方法对应Javascript中的escape()
函数和unescape()
函数。
1.8、URL工具-URLUtil
URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址。表示为互联网上的资源,如网页或者FTP地址。在Java中,也可以使用URL表示Classpath中的资源(Resource)地址。
•
URLUtil.normalize
标准化化URL链接。对于不带http://头的地址做简单补全。String url = "http://www.hutool.cn//aaa/bbb";
// 结果为:http://www.hutool.cn/aaa/bbb
String normalize = URLUtil.normalize(url);
url = "http://www.hutool.cn//aaa/\\bbb?a=1&b=2";
// 结果为:http://www.hutool.cn/aaa/bbb?a=1&b=2
normalize = URLUtil.normalize(url);
•
URLUtil.encode
封装URLEncoder.encode
,将需要转换的内容(ASCII码形式之外的内容),用十六进制表示法转换出来,并在之前加上%开头。String body = "366466 - 副本.jpg";
// 结果为:366466%20-%20%E5%89%AF%E6%9C%AC.jpg
String encode = URLUtil.encode(body);
1.9、枚举工具-EnumUtil
枚举(enum)算一种“语法糖”,是指一个经过排序的、被打包成一个单一实体的项列表。一个枚举的实例可以使用枚举项列表中任意单一项的值。枚举在各个语言当中都有着广泛的应用,通常用来表示诸如颜色、方式、类别、状态等等数目有限、形式离散、表达又极为明确的量。Java从JDK5开始,引入了对枚举的支持。
//定义枚举
public enum TestEnum{
TEST1("type1"), TEST2("type2"), TEST3("type3");
private TestEnum(String type) {
this.type = type;
}
private String type;
public String getType() {
return this.type;
}
}
// 获取枚举类中所有枚举对象的name列表
List<String> names = EnumUtil.getNames(TestEnum.class); //结果:[TEST1, TEST2, TEST3]
// 获得枚举类中各枚举对象下指定字段的值
List<Object> types = EnumUtil.getFieldValues(TestEnum.class, "type"); //结果:[type1, type2, type3]
1.10、数字工具-NumberUtil
数字工具针对数学运算做工具性封装
// 格式化为指定字符串
long c = 299792458;//光速
String format = NumberUtil.decimalFormat(",###", c);//299,792,458
1.11、数组工具-ArrayUtil
数组工具类主要针对原始类型数组和泛型数组相关方案进行封装
// 数组判空
int[] a = {};
int[] b = null;
ArrayUtil.isEmpty(a);
ArrayUtil.isEmpty(b);
1.12、随机工具-RandomUtil
RandomUtil主要针对JDK中Random对象做封装,严格来说,Java产生的随机数都是伪随机数,因此Hutool封装后产生的随机结果也是伪随机结果。不过这种随机结果对于大多数情况已经够用。
// 例如我们想产生一个[10, 100)的随机数,则:
int c = RandomUtil.randomInt(10, 100);
1.13、唯一ID工具-IdUtil
在分布式环境中,唯一ID生成应用十分广泛,生成方法也多种多样,Hutool针对一些常用生成策略做了简单封装。包括UUID
、ObjectId(MongoDB)
、Snowflake(Twitter)
// 生成的UUID是带-的字符串,类似于:a5c8a5e8-df2b-4706-bea4-08d0939410e3
String uuid = IdUtil.randomUUID();
// 生成的是不带-的字符串,类似于:b17f24ff026d40949c85a24f4f375d42
String simpleUUID = IdUtil.simpleUUID();
1.14、正则工具-ReUtil
在文本处理中,正则表达式几乎是全能的,但是Java的正则表达式有时候处理一些事情还是有些繁琐
// 给定字符串是否匹配给定正则
String content = "ZZZaaabbbccc中文1234";
boolean isMatch = ReUtil.isMatch("\\w+[\u4E00-\u9FFF]+\\d+", content);
Assert.assertTrue(isMatch);
1.15、身份证工具-IdcardUtil
支持大陆15位、18位身份证,港澳台10位身份证
String ID_18 = "321083197812162119";
String ID_15 = "150102880730303";
//是否有效
boolean valid = IdcardUtil.isValidCard(ID_18);
boolean valid15 = IdcardUtil.isValidCard(ID_15);
//转换
String convert15To18 = IdcardUtil.convert15To18(ID_15);
//年龄
DateTime date = DateUtil.parse("2017-04-10");
int age = IdcardUtil.getAgeByIdCard(ID_18, date);
int age2 = IdcardUtil.getAgeByIdCard(ID_15, date);
//生日
String birth = IdcardUtil.getBirthByIdCard(ID_18);
String birth2 = IdcardUtil.getBirthByIdCard(ID_15);