Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅;
提供了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的封装 |
hutool-socket | 基于Java的NIO和AIO的Socket封装 |
可以根据需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块。
在项目的pom.xml的dependencies中加入以下内容:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.2.4</version>
</dependency>
字符串工具类和正则支持(StrUtil):
//字符串是否是空白;是null;是不可见字符(如空格);是""
isBlank(CharSequence str)
//字符串是否为非空白;不为null;不为不可见字符(如空格);不为""
isNotBlank(CharSequence str)
//判定指定对象是否为是;是null;是""
isEmpty(Object obj)
//判定指定对象是否不为空;不为null;不为""
isNotEmpty(Object obj)
//除去字符串头尾部的空白,如果字符串是null,依然返回null
trim(CharSequence str)
//如果字符串是null,则返回指定默认字符串,否则返回字符串本身。
nullToDefault(CharSequence str, String defaultStr)
//切分字符串(切分成list)
List<String> split(CharSequence str, char separator)
//正则模式:
//是否以指定字符串开头
startWith(CharSequence str, CharSequence prefix)
//是否以指定字符串开头,忽略大小写
startWithIgnoreCase(CharSequence str, CharSequence prefix)
//给定字符串是否以任何一个字符串开始
startWithAny(CharSequence str, CharSequence... prefixes)
//是否以指定字符串结尾
endWith(CharSequence str, CharSequence suffix)
//是否以指定字符串结尾,忽略大小写
endWithIgnoreCase(CharSequence str, CharSequence suffix)
//给定字符串是否以任何一个字符串结尾
endWithAny(CharSequence str, CharSequence... suffixes)
//比较两个对象是否相等(大小写敏感)。
equal(Object obj1, Object obj2)
比较两个字符串是否相等。(是否忽略大小写)
equals(CharSequence str1, CharSequence str2, boolean ignoreCase)
//编码字符串,编码为UTF-8
byte[] utf8Bytes(CharSequence str)
//将byte数组转为字符串(charset为指定字符集)
str(byte[] bytes, String charset)
//以 conjunction 为分隔符将多个对象转换为字符串
String join(CharSequence conjunction, Object... objs)
//替换字符串中的指定字符串;str字符串;searchStr被查找的字符串;replacement 被替换的字符串
replace(CharSequence str, CharSequence searchStr, CharSequence replacement)
//生成随机UUID
uuid()
反射工具类
//获取某个类的所有方法
Method[] methods = ReflectUtil.getMethods(PmsBrand.class);
//获取某个类的指定方法
Method method = ReflectUtil.getMethod(PmsBrand.class, "getId");
//使用反射来创建对象
PmsBrand pmsBrand = ReflectUtil.newInstance(PmsBrand.class);
//反射执行对象的方法
ReflectUtil.invoke(pmsBrand, "setId", 1);
数字工具类:
String n3 = "1.234";
//判断是否为数字、整数、浮点数
NumberUtil.isNumber(n3);
NumberUtil.isInteger(n3);
NumberUtil.isDouble(n3);
Map和对象相互转换类:
PmsBrand brand = new PmsBrand();
brand.setId(1L);
brand.setName("小米");
brand.setShowStatus(0);
//Bean转Map
Map<String, Object> map = BeanUtil.beanToMap(brand);
LOGGER.info("beanUtil bean to map:{}", map);
//Map转Bean
PmsBrand mapBrand = BeanUtil.mapToBean(map, PmsBrand.class, false);
LOGGER.info("beanUtil map to bean:{}", mapBrand);
集合工具类:
//数组转换为列表
String[] array = new String[]{"a", "b", "c", "d", "e"};
List<String> list = CollUtil.newArrayList(array);
//join:数组转字符串时添加连接符号
String joinStr = CollUtil.join(list, ",");
LOGGER.info("collUtil join:{}", joinStr);
//将以连接符号分隔的字符串再转换为列表
List<String> splitList = StrUtil.split(joinStr, ',');
LOGGER.info("collUtil split:{}", splitList);
//创建新的Map、Set、List
HashMap<Object, Object> newMap = CollUtil.newHashMap();
HashSet<Object> newHashSet = CollUtil.newHashSet();
ArrayList<Object> newList = CollUtil.newArrayList();
//判断列表是否为空
CollUtil.isEmpty(list);
类型转换工具类
//转换为字符串
int a = 1;
String aStr = Convert.toStr(a);
//转换为指定类型数组
String[] b = {"1", "2", "3", "4"};
Integer[] bArr = Convert.toIntArray(b);
//转换为日期对象
String dateStr = "2017-05-06";
Date date = Convert.toDate(dateStr);
//转换为列表
String[] strArr = {"a", "b", "c", "d"};
List<String> strList = Convert.toList(String.class, strArr);
日期时间工具类(DateUtil):
//当前时间
Date date = DateUtil.date();
//Calendar转Date
date = DateUtil.date(Calendar.getInstance());
//时间戳转Date
date = DateUtil.date(System.currentTimeMillis());
//自动识别格式转换;字符串转换成日期
String dateStr = "2017-03-01";
date = DateUtil.parse(dateStr);
//自定义格式化转换;字符串转换成日期
date = DateUtil.parse(dateStr, "yyyy-MM-dd");
//格式化输出日期;日期转换成字符串
String format = DateUtil.format(date, "yyyy-MM-dd");
//获得年的部分
int year = DateUtil.year(date);
//获得月份,从0开始计数
int month = DateUtil.month(date);
对象比较和操作类(ObjectUtil):
//检查对象是否为null,不包括""
isNull(Object obj)
//检查对象是否不为null,不包括""
isNotNull(Object obj)
//判定指定对象是否为空;如果类型不对返回false
CharSequence(字符串)包括null和""
Map
Iterable
Iterator
Array
isEmpty(Object obj)
//判定指定对象是否不为空,包括字符串null和""
isNotEmpty(Object obj)
//比较两个对象是否相等。
equal(Object obj1, Object obj2)
//比较两个对象是否不相等
notEqual(Object obj1, Object obj2)
//检查是否是有效数字
isValidIfNumber(Object obj)
/**安全的对象比较,如果对象为空则;对象排在末尾
* @param c1 对象1,可以为{@code null}
* @param c2 对象2,可以为{@code null}
*@return 比较结果,如果c1 < c2,返回数小于0,c1==c2返回0,c1 > c2 大于0
*/
compare(T c1, T c2)
/**
* {@code null}安全的对象比较
*
* @param <T> 被比较对象类型
* @param c1 对象1,可以为{@code null}
* @param c2 对象2,可以为{@code null}
* @param nullGreater 当被比较对象为null时是否排在前面
* @return 比较结果,如果c1 < c2,返回数小于0,c1==c2返回0,c1 > c2 大于0
* @see java.util.Comparator#compare(Object, Object)
* @since 3.0.7
*/
compare(T c1, T c2, boolean nullGreater)
随机工具
随机工具应该是我们开发中用的较多的类库,Hutool 也封装了常用的 API。
• RandomUtil.randomInt 获得指定范围内的随机数
•
• RandomUtil.randomBytes 随机 bytes
•
• RandomUtil.randomEl 随机获得列表中的元素
•
• RandomUtil.randomEleSet 随机获得列表中的一定量的不重复元素,返回 Set
•
• RandomUtil.randomString 获得一个随机的字符串(只包含数字和字符)
•
• RandomUtil.randomNumbers 获得一个只包含数字的字符串
•
• RandomUtil.randomUUID 随机 UUID
•
• RandomUtil.weightRandom 权重随机生成器,传入带权重的对象,然后根据权重随机获取对象
加密解密工具
加密一般分为三种:
邮件工具
在 Java中 发送邮件主要品依靠 javax.mail 包,原生 API 使用比较繁琐,Hutool 在支持邮件发送的基础上,仍然依赖于 javax.mail 包。
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
邮件服务器的完整配置:
# 邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
host = smtp.yeah.net
# 邮件服务器的SMTP端口,可选,默认25
port = 25
# 发件人(必须正确,否则发送失败)
from = hutool@yeah.net
# 用户名,默认为发件人邮箱前缀
user = hutool
# 密码(注意,某些邮箱需要为SMTP服务单独设置授权码,详情查看相关帮助)
pass = q1w2e3
发送邮件:
• 发送普通文本邮件,最后一个参数可选是否添加多个附件:
//普通文本
MailUtil.send("hutool@foxmail.com", "测试", "邮件来自Hutool测试", false);
• 发送 HTML 格式的邮件并附带附件,最后一个参数可选是否添加多个附件:
//带HTML格式的邮件
MailUtil.send("hutool@foxmail.com", "测试", "<h1>邮件来自Hutool测试</h1>", true, FileUtil.file("d:/aaa.xml"));
• 群发邮件,可选 HTML 或普通文本,可选多个附件:
//群发
ArrayList<String> tos = CollUtil.newArrayList(
"person1@bbb.com",
"person2@bbb.com",
"person3@bbb.com",
"person4@bbb.com");
MailUtil.send(tos, "测试", "邮件来自Hutool群发测试", false);
HTML 工具
比如清除富文本编辑器中的 HTML 文本的指定标签,或者只保留普通文本。
HtmlUtil.cleanHtmlTag
清除所有 HTM L标签,但是保留标签内的内容。
String str = "pre<div class=\"test_div\">\r\n\t\tdfdsfdsfdsf\r\n</div><div class=\"test_div\">BBBB</div>";
// 结果为:pre\r\n\t\tdfdsfdsfdsf\r\nBBBB
String result = HtmlUtil.cleanHtmlTag(str);
HtmlUtil.removeHtmlTag
清除指定HTML标签和被标签包围的内容
String str = "pre<img src=\"xxx/dfdsfds/test.jpg\">";
// 结果为:pre
String result = HtmlUtil.removeHtmlTag(str, "img");
过滤 HTML 文本,防止 XSS 攻击
这个作用就不必多说,防止用户在输入文本中写入 HTML 标签对后台造成攻击。
String html = "<alert></alert>";
// 结果为:""
String filter = HtmlUtil.filter(html);
身份证工具
Hutool 封装的 IdcardUtil 可以用来对身份证进行验证,支持大陆 15 位、18 位身份证,港澳台 10 位身份证。
String ID_18 = "32436545766876";
String ID_15 = "6786787978080";
boolean valid = IdcardUtil.isValidCard(ID_18);
boolean valid15 = IdcardUtil.isValidCard(ID_15);
字段验证器
做 Web 开发的时候,后端通常需要对表单提交过来的数据进行验证。Hutool 封装的 Validator 可以进行很多有效的条件验证:
• 是不是邮箱
• 是不是 IP V4、V6
• 是不是电话号码
• 等等
Validator.isEmail("13246328");
Validator.isMobile("uyrbee.com");
图片工具
Hutool 封装的 ImgUtil 可以对图片进行缩放图像、切割图像、旋转、图像类型转换、彩色转黑白、文字水印、图片水印等
package com.rems.service;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import java.awt.*;
/**
* @program: rems
* @description:
* @author: hu.chen
* @createDate: 2021年04月30日 11:45
**/
public class mmm {
public static void main(String[] args) {
//缩小或放大图片
// ImgUtil.scale(
// FileUtil.file("D:/图片/Snipaste_2021-04-10_11-46-08.png"),
// FileUtil.file("D:/图片/ste_2021-04-30.png"),
// 0.5f
// );
//裁剪图片
// ImgUtil.cut(
// FileUtil.file("D:/图片/Snipaste_2021-04-10_11-46-08.png"),
// FileUtil.file("D:/图片/Snipaste_0002.png"),
// new Rectangle(200, 200, 100, 100)
// );
//给图片加水印
ImgUtil.pressText(//
FileUtil.file("D:/图片/Snipaste_2021-04-10_11-46-08.png"),
FileUtil.file("D:/图片/Snipaste_003.png"),
"陈虎测试水印", Color.WHITE,
new Font("黑体", Font.BOLD, 100),
0,
0,
0.8f
);
}
}
配置文件
于是,Hutool 的 Setting 运用而生。Setting 除了兼容 Properties 文件格式外,还提供了一些特有功能,这些功能包括:
先在项目的resourcr目录下创建一个配置文件 test.setting,内容如下
name=陈虎
age=16
创建测试类:
package com.rems.service;
import cn.hutool.setting.Setting;
/**
* @program: rems
* @description:
* @author: hu.chen
* @createDate: 2021年04月30日 11:45
**/
public class mmm {
public static void main(String[] args) {
// 初始化 Setting
Setting setting = new Setting("test.setting");
// 读取
String str = setting.getStr("name", "默认值");
System.err.println(str);
// 在配置文件变更时自动加载
setting.autoLoad(true);
// 通过代码方式增加键值对
setting.set("yeey", "2021年04月30日");
setting.store("test.setting");
// 读取
String yeey = setting.getStr("yeey", "程序运行时,自动增加的年份");
System.err.println(yeey);
}
}
缓存工具
CacheUtil 是 Hutool 封装的创建缓存的快捷工具类,可以创建不同的缓存对象
• FIFOCache:先入先出,元素不停的加入缓存直到缓存满为止,当缓存满时,清理过期缓存对象,清理后依旧满则删除先入的缓存。
//初始化一个3个容量的先进先出缓存
Cache<String, String> fifoCache = CacheUtil.newFIFOCache(3);
fifoCache.put("key1", "test01");
fifoCache.put("key2", "test02");
fifoCache.put("key3", "test03");
fifoCache.put("key4", "test04");
// 大小为 3,所以 key3 放入后 key1 被清除
String value1 = fifoCache.get("key1");
• LFUCache,最少使用,根据使用次数来判定对象是否被持续缓存,当缓存满时清理过期对象,清理后依旧满的情况下清除最少访问的对象并将其他对象的访问数减去这个最少访问数,以便新对象进入后可以公平计数。
//初始化一个3个容量的最少使用缓存
Cache<String, String> lfuCache = CacheUtil.newLFUCache(3);
lfuCache.put("key1", "test01");
// 因为获取了一次key1,所以使用次数+1
lfuCache.get("key1");
lfuCache.put("key2", "test02");
lfuCache.put("key3", "test03");
lfuCache.put("key4", "test04");
// 由于缓存容量只有 3,当加入第 4 个元素的时候,最少使用的将被移除(2,3被移除)
String value2 = lfuCache.get("key2");
String value3 = lfuCache.get("key3");
• LRUCache,最近最久未使用,根据使用时间来判定对象是否被持续缓存,当对象被访问时放入缓存,当缓存满了,最久未被使用的对象将被移除。
//初始化一个3个容量的最近最久未使用缓存
Cache<String, String> lruCache = CacheUtil.newLRUCache(3);
lruCache.put("key1", "test01");
lfuCache.put("key2", "test02");
lfuCache.put("key3", "test03");
// 使用时间近了,使用1次
lruCache.get("key1");
lfuCache.put("key4", "test04");
// 由于缓存容量只有 3,当加入第 4 个元素的时候,最久使用的将被移除(2)
String value2 = lruCache.get("key2");
System.out.println(value2);
最后放上Hutool的官网地址官网地址
上一篇
Excle导入和导出(2)
下一篇
Excle导入成list(1)
•