关于java:Hutool使用指南

67次阅读

共计 10773 个字符,预计需要花费 27 分钟才能阅读完成。

Hutool 是一个 Java 工具包,它帮忙咱们简化每一行代码,防止反复造轮子。如果你有须要用到某些工具办法的时候,无妨在 Hutool 外面找找,可能就有。本文将对 Hutool 中的常用工具类和办法进行介绍。## 一、简介 一个 Java 根底工具类,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 办法进行封装,组成各种 Util 工具类,同时提供以下组件:

  • hutool-core 外围,包含 Bean 操作、日期、各种 Util 等
  • hutool-aop JDK 动静代理封装,提供非 IOC 下的切面反对
  • hutool-bloomFilter 布隆过滤,提供一些 Hash 算法的布隆过滤
  • hutool-cache 缓存
  • hutool-cron 定时工作模块,提供类 Crontab 表达式的定时工作
  • hutool-crypto 加密解密模块
  • hutool-db JDBC 封装后的数据操作,基于 ActiveRecord 思维
  • hutool-dfa 基于 DFA 模型的多关键字查找
  • hutool-extra 扩大模块,对第三方封装(模板引擎、邮件等)
  • hutool-http 基于 HttpUrlConnection 的 Http 客户端封装
  • hutool-log 自动识别日志实现的日志门面
  • hutool-script 脚本执行封装,例如 Javascript
  • hutool-setting 性能更弱小的 Setting 配置文件和 Properties 封装
  • hutool-system 零碎参数调用封装(JVM 信息等)
  • hutool-json JSON 实现
  • hutool-captcha 图片验证码实现

二、装置

maven 我的项目在 pom.xml 增加以下依赖即可:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.2.2</version>
</dependency>
复制代码

三、常用工具类

1. DateUtil

日期工夫工具类,定义了一些罕用的日期工夫操作方法。

Date、long、Calendar 之间的互相转换

// 以后工夫
Date date = DateUtil.date();
// 以后工夫
Date date2 = DateUtil.date(Calendar.getInstance());
// 以后工夫
Date date3 = DateUtil.date(System.currentTimeMillis());
// 以后工夫字符串,格局:yyyy-MM-dd HH:mm:ss
String now = DateUtil.now();
// 以后日期字符串,格局:yyyy-MM-dd
String today= DateUtil.today();
复制代码

字符串转日期

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
String dateStr = "2020-03-01";
Date date = DateUtil.parse(dateStr);
复制代码

咱们也能够应用自定义日期格局转化:

String dateStr = "2020/03/02";
Date date = DateUtil.parse(dateStr, "yyyy/MM/dd");
复制代码

格式化日期输入

// 后果 2020/03/01
String format = DateUtil.format(date, "yyyy/MM/dd");

// 罕用格局的格式化
String formatDate = DateUtil.formatDate(date);
String formatDateTime = DateUtil.formatDateTime(date);
String formatTime = DateUtil.formatTime(date);
复制代码

获取 Date 对象的某个局部

// 取得年的局部
int year = DateUtil.year(date);
// 取得月份,从 0 开始计数
int month = DateUtil.month(date);
// 取得月份,从 0 开始计数
Month monthEnum = DateUtil.monthEnum(date);
// 取得日
int dayOfMonth = DateUtil.dayOfMonth(date);
// 取得星期数,从周日算起
int dayOfWeek = DateUtil.dayOfWeek(date);
// 取得星期枚举
Week dayOfWeekEnum = DateUtil.dayOfWeekEnum(date);
复制代码

开始和完结工夫

有的时候咱们须要取得每天的开始工夫、完结工夫,每月的开始和完结工夫等等,DateUtil 也提供了相干办法:

// 一天的开始,后果:2020-03-01 00:00:00
Date beginOfDay = DateUtil.beginOfDay(date);

// 一天的完结,后果:2020-03-01 23:59:59
Date endOfDay = DateUtil.endOfDay(date);
复制代码

日期工夫偏移

日期或工夫的偏移指针对某个日期减少或缩小分、小时、天等等,达到日期变更的目标。Hutool 也针对其做了大量封装

Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2);

DateTime newDate2 = DateUtil.offsetDay(date, 3);

DateTime newDate3 = DateUtil.offsetHour(date, -3);
复制代码

针对以后工夫,提供了简化的偏移办法(例如昨天、上周、上个月等):

// 昨天
DateUtil.yesterday()
// 今天
DateUtil.tomorrow()
// 上周
DateUtil.lastWeek()
// 下周
DateUtil.nextWeek()
// 上个月
DateUtil.lastMonth()
// 下个月
DateUtil.nextMonth()
复制代码

日期时间差

有时候咱们须要计算两个日期之间的时间差(相差天数、相差小时数等等),Hutool 将此类办法封装为 between 办法:

long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);
复制代码

计时器

计时器用于计算某段代码或过程破费的工夫

TimeInterval timer = DateUtil.timer();

//---------------------------------
//------- 这是执行过程
//---------------------------------

timer.interval();// 破费毫秒数
timer.intervalRestart();// 返回破费工夫,并重置开始工夫
timer.intervalMinute();// 破费分钟数
复制代码

其它

// 年龄
DateUtil.ageOfNow("1993-03-01");

// 是否平年
DateUtil.isLeapYear(2017);
复制代码

2. Convert

类型转换工具类,用于各种类型数据的转换。外面封装了针对 Java 常见类型的转换,用于简化类型转换。Convert 类中大部分办法为 toXXX,参数为 Object,能够实现将任意可能的类型转换为指定类型。同时反对第二个参数 defaultValue 用于在转换失败时返回一个默认值。####Java 常见类型转换

  1. 转换为字符串:
int a = 1;
//aStr 为 "1"
String aStr = Convert.toStr(a);

long[] b = {1,2,3,4,5};
//bStr 为:"[1, 2, 3, 4, 5]"
String bStr = Convert.toStr(b);
复制代码
  1. 转换为指定类型数组:
String[] b = { "1", "2", "3", "4"};
// 后果为 Integer 数组
Integer[] intArray = Convert.toIntArray(b);

long[] c = {1,2,3,4,5};
// 后果为 Integer 数组
Integer[] intArray2 = Convert.toIntArray(c);
复制代码
  1. 转换为日期对象:
String a = "2020-03-01";
Date value = Convert.toDate(a);
复制代码
  1. 转换为汇合
Object[] a = {"a", "你", "好", "", 1};
List<?> list = Convert.convert(List.class, a);
// 从 4.1.11 开始能够这么用
List<?> list = Convert.toList(a);
复制代码

其它类型转换

  1. 规范类型

通过 Convert.convert(Class<T>, Object) 办法能够将任意类型转换为指定类型,Hutool 中预约义了许多类型转换,例如转换为 URI、URL、Calendar 等等。

  1. 泛型类型

通过 convert(TypeReference<T> reference, Object value) 办法,自行 new 一个 TypeReference 对象能够对嵌套泛型进行类型转换。例如,咱们想转换一个对象为 List<String> 类型,此时传入的规范 Class 就无奈满足要求,此时咱们能够这样:

Object[] a = { "a", "你", "好", "", 1};
List<String> list = Convert.convert(new TypeReference<List<String>>() {}, a);
复制代码

通过 TypeReference 实例化后制订泛型类型,即可转换对象为咱们想要的指标类型。

半角和全角转换

在很多文本的统一化中这两个办法十分有用,次要对标点符号的全角半角转换。

半角转全角:

String a = "123456789,$()?!:;";

// 后果为:"123456789,$()?!:;"
String sbc = Convert.toSBC(a);
复制代码

全角转半角:

String a = "123456789,$()?!:;";

// 后果为 "123456789,$()?!:;"
String dbc = Convert.toDBC(a);
复制代码

16 进制(Hex)

在很多加密解密,以及中文字符串传输(比方表单提交)的时候,会用到 16 进制转换,就是 Hex 转换,为此 Hutool 中专门封装了 HexUtil 工具类,思考到 16 进制转换也是转换的一部分,因而将其办法也放在 Convert 类中,便于了解和查找,应用同样非常简单:

转为 16 进制(Hex)字符串

String a = "字符串";
String hex = Convert.toHex(a, CharsetUtil.CHARSET_UTF_8);
复制代码

将 16 进制(Hex)字符串转为一般字符串:

String hex = "e5ad97e7aca6e4b8b2";
String raw = Convert.hexToStr(hex, CharsetUtil.CHARSET_UTF_8);
复制代码

因为字符串牵涉到编码问题,因而必须传入编码对象,此处应用 UTF-8 编码。toHex 办法同样反对传入 byte[],同样也能够应用 hexToBytes 办法将 16 进制转为 byte[]

Unicode 和字符串转换

与 16 进制相似,Convert 类同样能够在字符串和 Unicode 之间轻松转换:

String unicode = Convert.strToUnicode(a);
String raw = Convert.unicodeToStr(unicode);
复制代码

编码转换

在接管表单的时候,咱们经常被中文乱码所困扰,其实大多数起因是应用了不正确的编码方式解码了数据。于是 Convert.convertCharset 办法便派上用场了,它能够把乱码转为正确的编码方式:

String a = "我不是乱码";
// 转换后 result 为乱码
String result = Convert.convertCharset(a, CharsetUtil.UTF_8, CharsetUtil.ISO_8859_1);
String raw = Convert.convertCharset(result, CharsetUtil.ISO_8859_1, "UTF-8");
Assert.assertEquals(raw, a);
复制代码

工夫单位转换

Convert.convertTime办法次要用于转换时长单位,比方一个很大的毫秒,我想取得这个毫秒数对应多少分:

long a = 4535345;

// 后果为:75
long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);
复制代码

金额大小写转换

面对财务类需要,Convert.digitToChinese将金钱数转换为大写模式:

double money = 1234.56;

// 后果为:"壹仟贰佰叁拾肆元伍角陆分"
String digitUppercase = Convert.digitToChinese(a);
复制代码

留神 转换为大写只能准确到分(小数点儿后两位),之后的数字会被疏忽。

原始类和包装类转换

有的时候,咱们须要将包装类和原始类互相转换(比方 Integer.classs 和 int.class),这时候咱们能够:

// 去包装
Class<?> wrapClass = Integer.class;
// 后果为:int.class
Class<?> unWraped = Convert.unWrap(wrapClass);

// 包装
Class<?> primitiveClass = long.class;
// 后果为:Long.class
Class<?> wraped = Convert.wrap(primitiveClass);
复制代码

3. StrUtil

字符串工具类,定义了一些罕用的字符串操作方法。#### hasBlank、hasEmpty 办法

就是给定一些字符串,如果一旦有空的就返回 true,罕用于判断好多字段是否有空的(例如 web 表单数据)。

这两个办法的区别是 hasEmpty 只判断是否为 null 或者空字符串(””),hasBlank则会把不可见字符也算做空,isEmptyisBlank 同理。

removePrefix、removeSuffix 办法

这两个是去掉字符串的前缀后缀的,例如去个文件名的扩展名啥。

String fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg")  //fileName -> pretty_girl
复制代码

还有疏忽大小写的 removePrefixIgnoreCaseremoveSuffixIgnoreCase都比拟实用。

sub 办法

subString 办法越界会报异样,得本人判断,sub 把各种状况判断都加进来了,而且 index 的地位还反对正数,-1 示意最初一个字符,如果不小心把第一个地位和第二个地位搞反了,也会主动修改

String str = "abcdefgh";
String strSub1 = StrUtil.sub(str, 2, 3);
String strSub2 = StrUtil.sub(str, 2, -3); 
String strSub3 = StrUtil.sub(str, 3, 2); 
复制代码

format 办法

String template = "{}和{}";
String str = StrUtil.format(template, "我", "你");
复制代码

参数是 Object 类型,传别的类型会主动调用 toString() 办法。

4. NumberUtil

数字解决工具类,可用于各种类型数字的加减乘除操作及判断类型。

double n1 = 1.234;
double n2 = 1.234;
double result;
// 对 float、double、BigDecimal 做加减乘除操作
result = NumberUtil.add(n1, n2);
result = NumberUtil.sub(n1, n2);
result = NumberUtil.mul(n1, n2);
result = NumberUtil.div(n1, n2);
// 保留两位小数
BigDecimal roundNum = NumberUtil.round(n1, 2);
String n3 = "1.234";
// 判断是否为数字、整数、浮点数
NumberUtil.isNumber(n3);
NumberUtil.isInteger(n3);
NumberUtil.isDouble(n3);

复制代码

5. BeanUtil

JavaBean 的工具类,可用于 Map 与 JavaBean 对象的相互转换以及对象属性的拷贝。

Map 转 Bean

提供了 Map 对象键值对注入 Bean,其办法有:

  1. BeanUtil.fillBeanWithMap 应用 Map 填充 bean
HashMap<String, Object> map = CollUtil.newHashMap();
map.put("name", "Joe");
map.put("age", 12);
map.put("openId", "DFDFSDFWERWER");

Person person = BeanUtil.fillBeanWithMap(map, new Person(), false);
复制代码
  1. BeanUtil.fillBeanWithMapIgnoreCase 应用 Map 填充 bean,疏忽大小写
HashMap<String, Object> map = CollUtil.newHashMap();
map.put("Name", "yxm");
map.put("aGe", 12);
map.put("openId", "DFDFSDFWERWER");
Person person = BeanUtil.fillBeanWithMapIgnoreCase(map, new Person(), false);
复制代码

同时提供了 map 转 bean 的办法,与 fillBean 不同的是,此处并不是传 Bean 对象,而是 Bean 类,Hutool 会主动调用默认构造方法创建对象。当然,前提是 Bean 类有默认构造方法(空结构),这些办法有:

  1. mapToBean,mapToBeanIgnoreCase
// 设置别名,用于对应 bean 的字段名
HashMap<String, String> mapping = CollUtil.newHashMap();
mapping.put("a_name", "name");
mapping.put("b_age", "age");
Person person = BeanUtil.mapToBean(map, Person.class, CopyOptions.create().setFieldMapping(mapping));
复制代码

Bean 转为 Map

BeanUtil.beanToMap办法则是将一个 Bean 对象转为 Map 对象。

Person person = new Person();
person.setAge(14);
person.setOpenid("11213232");
person.setName("测试 A11");
person.setSubName("sub 名字");

Map<String, Object> map = BeanUtil.beanToMap(person);
复制代码

Bean 转 Bean

Bean 之间的转换次要是雷同属性的复制,因而办法名为copyProperties,此办法反对 Bean 和 Map 之间的字段复制。

BeanUtil.copyProperties办法同样提供一个 CopyOptions 参数用于自定义属性复制。

Person p1 = new Person();
p1.setSlow(true);
p1.setName("测试");
p1.setSubName("sub 测试");

Map<String, Object> map = MapUtil.newHashMap();

BeanUtil.copyProperties(p1, map);
复制代码

6. ReflectUtil

Java 反射工具类,可用于反射获取类的办法及创建对象。

// 获取某个类的所有办法
Method[] methods = ReflectUtil.getMethods(PmsBrand.class);
// 获取某个类的指定办法
Method method = ReflectUtil.getMethod(PmsBrand.class, "getId");
// 应用反射来创建对象
PmsBrand pmsBrand = ReflectUtil.newInstance(PmsBrand.class);
// 反射执行对象的办法
ReflectUtil.invoke(pmsBrand, "setId", 1);

复制代码

7. CollUtil

汇合操作的工具类,定义了一些罕用的汇合操作。

// 数组转换为列表
String[] array = new String[]{"a", "b", "c", "d", "e"};
List<String> list = CollUtil.newArrayList(array);
List<String> list2 = CollUtil.newArrayList("1","2","3");
//join:数组转字符串时增加连贯符号
String joinStr = CollUtil.join(list, ",");
// 将以连贯符号分隔的字符串再转换为列表
List<String> splitList = StrUtil.split(joinStr, ',');
// 创立新的 Map、Set、List
HashMap<Object, Object> newMap = CollUtil.newHashMap();
HashSet<Object> newHashSet = CollUtil.newHashSet();
ArrayList<Object> newList = CollUtil.newArrayList();
// 判断列表是否为空
CollUtil.isEmpty(list);
复制代码

zip办法:给定两个汇合,而后两个汇合中的元素一一对应,成为一个 Map。此办法还有一个重载办法,能够传字符,而后给定分分隔符,字符串会被 split 成列表。

List<String> keys = CollUtil.newArrayList("a", "b", "c");
List<Integer> values = CollUtil.newArrayList(1, 2, 3);
Map<String, Integer> map = CollUtil.zip(keys, values);
System.out.println(map);    // {b=2, c=3, a=1}

String a = "a,b,c";
String b = "1,2,3";
Map<String, String> map2 = CollUtil.zip(a, b, ",");
System.out.println(map2);   // {b=2, c=3, a=1}
复制代码

8. MapUtil

Map 操作工具类,可用于创立 Map 对象及判断 Map 是否为空。

// 将多个键值对退出到 Map 中
Map<Object, Object> map = MapUtil.of(new String[][]{{"key1", "value1"},
    {"key2", "value2"},
    {"key3", "value3"}
});
// 判断 Map 是否为空
MapUtil.isEmpty(map);
MapUtil.isNotEmpty(map);

复制代码
  • toListMap 行转列,合并雷同的键,值合并为列表,将 Map 列表中雷同 key 的值组成列表做为 Map 的 value,例如传入数据是:

[{a: 1, b: 1, c: 1} {a: 2, b: 2} {a: 3, b: 3} {a: 4} ]

后果为:

{a: [1,2,3,4] b: [1,2,3,] c: [1] }

  • toMapList 列转行。将 Map 中值列表别离依照其地位与 key 组成新的 map
  • join、joinIgnoreNull 将 Map 依照给定的分隔符转换为字符串
  • reverse Map 的键和值调换
  • sort 排序 Map
  • getAny 获取 Map 的局部 key 生成新的 Map
  • get、getXXX 获取 Map 中指定类型的值

9. AnnotationUtil

注解工具类,可用于获取注解与注解中指定的值。

// 获取指定类、办法、字段、结构器上的注解列表
Annotation[] annotationList = AnnotationUtil.getAnnotations(HutoolController.class, false);
// 获取指定类型注解
Api api = AnnotationUtil.getAnnotation(HutoolController.class, Api.class);
// 获取指定类型注解的值
Object annotationValue = AnnotationUtil.getAnnotationValue(HutoolController.class, RequestMapping.class);

复制代码

10. SecureUtil

加密解密工具类,可用于 MD5 加密。

//MD5 加密
String str = "123456";
String md5Str = SecureUtil.md5(str);
LOGGER.info("secureUtil md5:{}", md5Str);

复制代码

对称加密

  • SecureUtil.aes
  • SecureUtil.des

摘要算法

  • SecureUtil.md5
  • SecureUtil.sha1
  • SecureUtil.hmac
  • SecureUtil.hmacMd5
  • SecureUtil.hmacSha1

非对称加密

  • SecureUtil.rsa
  • SecureUtil.dsa

UUID

  • SecureUtil.simpleUUID 办法提供无“-”的 UUID

密钥生成

  • SecureUtil.generateKey 针对对称加密生成密钥
  • SecureUtil.generateKeyPair 生成密钥对(用于非对称加密)
  • SecureUtil.generateSignature 生成签名(用于非对称加密)

其余工具类

Hutool 中的工具类很多,能够参考:www.hutool.cn/

四、我的项目源码地址

github.com/macrozheng/…

正文完
 0