一、简介

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封装

源码如下:

java 工具类设计 java工具类库_Hutool工具类

可以根据需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块,单独引入某个模块例如:hutool-corehutool-http

四、集成Hutool工具

1. Maven管理依赖

在项目的pom.xmldependencies中加入以下内容:

  • 引入所有模块
<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系列基本上是稳稳的。

java 工具类设计 java工具类库_Hutool_02

六、日期格式化与解析

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 转为长整数

java 工具类设计 java工具类库_Hutool工具类_03

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() 定时任务

八、文档

官网 : http://www.hutool.cn/

Github : https://github.com/looly/hutool

Gitee: https://gitee.com/loolly/hutool