一、简介
Hutool
是一个小而全的Java
工具类库,通过静态方法封装,降低相关API
的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java
语言也可以“甜甜的”。
Hutool
中的工具方法来自于每个用户的精雕细琢,它涵盖了Java
开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
Hutool
是项目中“util
”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug
。
二、Hutool如何改变我们的coding方式
Hutool
的目标是使用一个工具方法代替一段复杂代码,从而最大限度的避免“复制粘贴”代码的问题,彻底改变我们写代码的方式。
以计算MD5
为例:
- 【以前】打开搜索引擎 -> 搜“
Java MD5加密
” -> 打开某篇博客-> 复制粘贴 -> 改改好用 - 【现在】引入
Hutool -> SecureUtil.md5()
Hutool
的存在就是为了减少代码搜索成本,避免网络上参差不齐的代码出现导致的bug
。
三、Hutool包含组件
Hutool
是一个Java
基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util
工具类,同时提供以下组件:
模块 | 介绍 |
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-all
方式引入所有模块,单独引入某个模块例如:hutool-core
、hutool-http
。
四、集成Hutool工具
1. Maven管理依赖
在项目的pom.xml
的dependencies
中加入以下内容:
- 引入所有模块
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.1</version>
</dependency>
- 引入单独模块
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.5.1</version>
</dependency>
2. Gradle管理依赖
- 引入所有模块
compile 'cn.hutool:hutool-all:5.5.1'
- 引入单独模块
compile 'cn.hutool:hutool-core:5.5.1'
3. 非Maven项目
点击以下任一链接,下载hutool-all-X.X.X.jar
即可:
注意 Hutool 5.x
支持JDK8+
,对Android
平台没有测试,不能保证所有工具类或工具方法可用。 如果你的项目使用JDK7
,请使用Hutool 4.x
版本。
五、String判断空
Hutool
中封装了常用的String
字符串判空,简洁的调用参数、良好的设计模式、主要功能覆盖全面的测试用例、详尽的中文注释,替代common-XX
系列基本上是稳稳的。
六、日期格式化与解析
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
1. Date、long、Calendar之间的相互转换
/**
* 1. Date、long、Calendar之间的相互转换
*/
@Test
public void contextLoads() {
//当前时间 格式:yyyy-MM-dd HH:mm:ss , 结果:2020-11-24 13:49:10
DateTime date = DateUtil.date();
System.out.println("date = " + date);
//当前日期字符串,格式:yyyy-MM-dd , 结果:2020-11-24
String today = DateUtil.today();
System.out.println("today = " + today);
//当前时间 格式:yyyy-MM-dd HH:mm:ss , 结果:2020-11-24 13:49:10
Date date2 = DateUtil.date(Calendar.getInstance());
System.out.println("date2 = " + date2);
//当前时间 格式:yyyy-MM-dd HH:mm:ss , 结果:2020-11-24 13:49:10
Date date3 = DateUtil.date(System.currentTimeMillis());
System.out.println("date3 = " + date3);
//当前时间字符串,格式:yyyy-MM-dd HH:mm:ss , 结果:2020-11-24 13:49:10
String now = DateUtil.now();
System.out.println("now = " + now);
}
2. 字符串转日期
/**
* 2. 字符串转日期
* @desc: DateUtil.parse方法会自动识别一些常用格式,包括:
* 1.yyyy-MM-dd HH:mm:ss
* 2.yyyy-MM-dd
* 3.HH:mm:ss
* 4.yyyy-MM-dd HH:mm
* 5.yyyy-MM-dd HH:mm:ss.SSS
*/
@Test
public void contextLoads1(){
//格式:yyyy-MM-dd 00:00:00 , 结果:2020-11-24 13:49:10
String dateStr = "2017-03-01";
Date date = DateUtil.parse(dateStr);
System.out.println("date = " + date);
//格式:yyyy-MM-dd 00:00:00 , 结果:2017-03-01 00:00:00
String dateStr1 = "2017-03-01";
Date date1 = DateUtil.parse(dateStr1, "yyyy-MM-dd");
System.out.println("date1 = " + date1);
//格式:yyyy-MM-dd HH:mm:ss , 结果:2020-11-24 13:45:02
Date date2 = new Date();
String s = DateUtil.formatDateTime(date2);
System.out.println("date2 = " + s);
}
3. 格式化日期输出
/**
* 3. 格式化日期输出
*/
@Test
public void contextLoads2(){
String dateStr = "2017-03-01";
Date date = DateUtil.parse(dateStr);
System.out.println("date = " + date);
//格式:yyyy/MM/dd , 结果:2017/03/01
String format = DateUtil.format(date, "yyyy/MM/dd");
System.out.println("format = " + format);
//格式:yyyy-MM-dd , 结果:2017-03-01
String formatDate = DateUtil.formatDate(date);
System.out.println("formatDate = " + formatDate);
//格式:yyyy-MM-dd 00:00:00 , 结果:2017-03-01 00:00:00
String formatDateTime = DateUtil.formatDateTime(date);
System.out.println("formatDateTime = " + formatDateTime);
//格式:00:00:00 , 结果:00:00:00
String formatTime = DateUtil.formatTime(date);
System.out.println("formatTime = " + formatTime);
}
4. 获取Date对象的某个部分
/**
* 4. 获取Date对象的某个部分
*/
@Test
public void contextLoad3(){
//获取当前时间,格式:yyyy-MM-dd HH:mm:ss , 结果:2020-11-24 13:56:17
Date date = DateUtil.date();
System.out.println("date = " + date);
//获得年的部分,结果:2020
int year = DateUtil.year(date);
System.out.println("year = " + year);
//获得月份,从0开始计数,结果:10
int month = DateUtil.month(date);
System.out.println("month = " + month);
//获得月份枚举,结果:NOVEMBER
Month month1 = DateUtil.monthEnum(date);
System.out.println("month1 = " + month1);
//.....
}
5. 开始和结束时间
/**
* 5. 开始和结束时间
* @desc: 有的时候我们需要获得每天的开始时间、结束时间,每月的开始和结束时间等等,DateUtil也提供了相关方法:
*
*/
@Test
public void contextLoad4(){
String dateStr = "2017-03-01 22:33:23";
Date date = DateUtil.parse(dateStr);
System.out.println("date = " + date);
//一天的开始,格式:yyyy-MM-dd 00:00:00 , 结果:2017-03-01 00:00:00
Date beginOfDay = DateUtil.beginOfDay(date);
System.out.println("beginOfDay = " + beginOfDay);
//一天的结束,格式:yyyy-MM-dd 23:59:59 , 结果:2017-03-01 23:59:59
Date endOfDay = DateUtil.endOfDay(date);
System.out.println("endOfDay = " + endOfDay);
}
6. 日期时间偏移
/**
* 6. 日期时间偏移
* @desc: 日期或时间的偏移指针对某个日期增加或减少分、小时、天等等,达到日期变更的目的。Hutool也针对其做了大量封装
*/
@Test
public void contextLoad5(){
String dateStr = "2017-03-01 22:33:23";
Date date = DateUtil.parse(dateStr);
//结果:2017-03-03 22:33:23
Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2);
System.out.println("newDate = " + newDate);
//常用偏移,结果:2017-03-04 22:33:23
DateTime newDate2 = DateUtil.offsetDay(date, 3);
System.out.println("newDate2 = " + newDate2);
//常用偏移,结果:2017-03-01 19:33:23
DateTime newDate3 = DateUtil.offsetHour(date, -3);
System.out.println("newDate3 = " + newDate3);
//针对当前时间,提供了简化的偏移方法(例如昨天、上周、上个月等):
//昨天
DateTime yesterday = DateUtil.yesterday();
System.out.println("yesterday = " + yesterday);
//明天
DateTime tomorrow = DateUtil.tomorrow();
System.out.println("tomorrow = " + tomorrow);
//上周
DateTime lastweek = DateUtil.lastWeek();
System.out.println("lastweek = " + lastweek);
//下周
DateTime nextWeek = DateUtil.nextWeek();
System.out.println("nextWeek = " + nextWeek);
//上个月
DateTime lastMonth = DateUtil.lastMonth();
System.out.println("lastMonth = " + lastMonth);
//下个月
DateTime nextMonth = DateUtil.nextMonth();
System.out.println("nextMonth = " + nextMonth);
}
7. 日期时间差
/**
* 7. 日期时间差
* @desc: 有时候我们需要计算两个日期之间的时间差(相差天数、相差小时数等等),Hutool将此类方法封装为between方法:
*/
public void contextLoad6(){
String dateStr1 = "2017-03-01 22:33:23";
Date date1 = DateUtil.parse(dateStr1);
String dateStr2 = "2017-04-01 23:33:23";
Date date2 = DateUtil.parse(dateStr2);
//相差一个月,31天
long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);
System.out.println("betweenDay = " + betweenDay);
}
8. 计时器
/**
* 8. 计时器
* @desc; 计时器用于计算某段代码或过程花费的时间
*/
@Test
public void contextLoad7(){
TimeInterval timer = DateUtil.timer();
//---------------------------------
//-------这是执行过程
//---------------------------------
long interval = timer.interval();//花费毫秒数
System.out.println("interval = " + interval);
long intervalRestart = timer.intervalRestart();//返回花费时间,并重置开始时间
System.out.println("intervalRestart = " + intervalRestart);
long intervalMinute = timer.intervalMinute();//花费分钟数
System.out.println("intervalMinute = " + intervalMinute);
}
9. 星座和属相
/**
* 9. 星座和属相
*/
@Test
public void contextLoad8(){
// 结果: "水瓶座"
String zodiac = DateUtil.getZodiac(Month.JANUARY.getValue(), 25);
System.out.println("zodiac = " + zodiac);
// 结果: "猪"
String chineseZodiac = DateUtil.getChineseZodiac(1995);
System.out.println("chineseZodiac = " + chineseZodiac);
//年龄, 结果: 30
int ageOfNow = DateUtil.ageOfNow("1990-01-30");
System.out.println("ageOfNow = " + ageOfNow);
//是否闰年, 结果:true
boolean leapYear = DateUtil.isLeapYear(2020);
System.out.println("leapYear = " + leapYear);
}
七、常用工具类
1. 集合操作
* CollUtil.isEmpty 判断为空(null或空集)
* CollUtil.distinct 集合去重
* CollUtil. removeNull 集合去空
* CollUtil.union 并集
* CollUtil.disjunction 交集
2. 万能转换
* Convert.toInt 转为整数
* Convert.toLong 转为长整数
3. 摘要计算与Base64
* SecureUtil.md5 计算Md5摘要
* SecureUtil.sha1 计算SHA1摘要
* Base64.encode Base64字符串加密
* Base64.decodeStr Base64字符串解密
4. 文件读写
* FileUtil.readBytes 按字节读
* FileUtil.readLines 按行读
* FileUtil.readString 全部读
* FileUtil.writeBytes 按字节写
* FileUtil.writeLines 按行写
* FileUtil.writeString 全部写
5. 更多
IdcardUtil.isValidCard 身份证校验
Setting配置文件读取
SqlRunner数据库操作工具类
NetUtil.getLocalhostStr()获取本机ip地址
NumberUtil.round 四舍五入
RandomUtil.randomInt 获取随机数
RuntimeUtil.execForStr 执行命令行
CaptchaUtil.createLineCaptcha 验证码工具类
ExcelReader ExcelWriter Excel 读写
CronUtil.start() 定时任务
八、文档
Github : https://github.com/looly/hutool
Gitee: https://gitee.com/loolly/hutool