Hutool 简介
Hutool 是一款小而全的开源开发工具类库,在 github 上拥有将近一万九的 star,基本上你能想到的开发当中常需要用到的小轮子,基本上都有具备。学习一下 hutool 工具包可以避免我们在平常开发中重复造轮子。这款 hutool 开源库,更新频率快,jar 包小仅 1.5Mb。对比其他同款类型的基础工具类库来说,是一大优势。因为其他同款类型的基础工具类库多多少少都有基于 apache commons 做了一些封装。
对于很多小型公司来说,公司内部并没有完善的基础工具类库,使用 hutool 可以节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务同时可以最大限度的避免封装不完善带来的 bug。
Hutool 主要组件
模块 | 介绍 |
---|---|
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 库的工具类非常全,一篇文章难以概括。以下就列举开发中常用到的工具类。
常用工具类介绍
工具类内包含的方法都比较齐全,我们就不一一列举,仅列举比较有代表性的方法。
DateUtil
字符串转日期
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
String dateStr = "2017-03-01";
Date date = DateUtil.parse(dateStr);
我们也可以使用自定义日期格式转化:
String dateStr = "2017-03-01";
Date date = DateUtil.parse(dateStr, "yyyy-MM-dd");
计时器(常用于计算代码执行时间)
TimeInterval timer = DateUtil.timer();
//---------------------------------
//-------这是执行过程
//---------------------------------
timer.interval();//花费毫秒数
timer.intervalRestart();//返回花费时间,并重置开始时间
timer.intervalMinute();//花费分钟数
IoUtil
拷贝:流的读写可以总结为从输入流读取,从输出流写出,这个过程我们定义为拷贝。这个是一个基本过程,也是文件、流操作的基础。
以文件流拷贝为例:
BufferedInputStream in = FileUtil.getInputStream("d:/test.txt");
BufferedOutputStream out = FileUtil.getOutputStream("d:/test2.txt");
long copySize = IoUtil.copy(in, out, IoUtil.DEFAULT_BUFFER_SIZE);
FileUtil
FileUtil 内包含以下方法:
- 文件操作:包括文件目录的新建、删除、复制、移动、改名等
- 文件判断:判断文件或目录是否非空,是否为目录,是否为文件等等。
- 绝对路径:针对 ClassPath 中的文件转换为绝对路径文件。
- 文件名:主文件名,扩展名的获取
- 读操作:包括类似 IoUtil 中的 getReader、readXXX 操作
- 写操作:包括 getWriter 和 writeXXX 操作
EnumUtil
首先我们定义一个枚举对象:
//定义枚举
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;
}
}
getNames
获取枚举类中所有枚举对象的 name 列表。栗子:
//定义枚举
public enum TestEnum {
TEST1, TEST2, TEST3;
}
List<String> names = EnumUtil.getNames(TestEnum.class);
//结果:[TEST1, TEST2, TEST3]
ImgUtil
scale 缩放图片
提供两种重载方法:其中一个是按照长宽缩放,另一种是按照比例缩放。
ImgUtil.scale(
FileUtil.file("d:/face.jpg"),
FileUtil.file("d:/face_result.jpg"),
0.5f//缩放比例
);
cut 剪裁图片
ImgUtil.cut(
FileUtil.file("d:/face.jpg"),
FileUtil.file("d:/face_result.jpg"),
new Rectangle(200, 200, 100, 100)//裁剪的矩形区域
);
NetUtil
网络工具类主要包含以下方法
- longToIpv4 根据 long 值获取 ip v4 地址
- ipv4ToLong 根据 ip 地址计算出 long 型的数据
- isUsableLocalPort 检测本地端口可用性
- isValidPort 是否为有效的端口
- isInnerIP 判定是否为内网 IP
- localIpv4s 获得本机的 IP 地址列表
- toAbsoluteUrl 相对 URL 转换为绝对 URL
- hideIpPart 隐藏掉 IP 地址的最后一部分为 * 代替
- buildInetSocketAddress 构建 InetSocketAddress
- getIpByHost 通过域名得到 IP
- isInner 指定 IP 的 long 是否在指定范围内
SecureUtil
加密工具类主要针对常用加密算法构建快捷方式,还有提供一些密钥生成的快捷工具方法。
对称加密
SecureUtil.aes
SecureUtil.des
摘要算法
SecureUtil.md5
SecureUtil.sha1
SecureUtil.hmac
SecureUtil.hmacMd5
SecureUtil.hmacSha1
非对称加密
SecureUtil.rsa
SecureUtil.dsa
HtmlUtil
比如我们在使用爬虫爬取 HTML 页面后,需要对返回页面的 HTML 内容做一定处理,比如去掉指定标签(例如广告栏等)、去除 JS、去掉样式等等,这些操作都可以使用 HtmlUtil 完成。
HtmlUtil.removeHtmlTag 清除指定 HTML 标签和被标签包围的内容
String str = "pre<img src=\"xxx/dfdsfds/test.jpg\">";
// 结果为:pre
String result = HtmlUtil.removeHtmlTag(str, "img");
HtmlUtil.filter 过滤 HTML 文本,防止 XSS 攻击
String html = "<alert></alert>";
// 结果为:""
String filter = HtmlUtil.filter(html);
HtmlUtil.removeAllHtmlAttr 去除指定标签的所有属性
String html = "<div class=\"test_div\" width=\"120\"></div>";
// 结果为:<div></div>
String result = HtmlUtil.removeAllHtmlAttr(html, "div");
QrCodeUtil
二维码工具类仅需一行代码
// 生成指定url对应的二维码到文件,宽和高都是300像素
QrCodeUtil.generate("https://hutool.cn/", 300, 300, FileUtil.file("d:/qrcode.jpg"));
TokenizerUtil
中文分词工具类
解析文本并分词
//自动根据用户引入的分词库的jar来自动选择使用的引擎
TokenizerEngine engine = TokenizerUtil.createEngine();
//解析文本
String text = "这两个方法的区别在于返回值";
Result result = engine.parse(text);
//输出:这 两个 方法 的 区别 在于 返回 值
String resultStr = CollUtil.join((Iterator<Word>)result, " ");
ExcelUtil
Excel 操作工具封装
使用
从文件中读取 Excel 为 ExcelReader
ExcelReader reader = ExcelUtil.getReader(FileUtil.file("test.xlsx"));
从流中读取 Excel 为 ExcelReader(比如从 ClassPath 中读取 Excel 文件)
ExcelReader reader = ExcelUtil.getReader(ResourceUtil.getStream("aaa.xlsx"));
读取指定的 sheet
ExcelReader reader;
//通过sheet编号获取
reader = ExcelUtil.getReader(FileUtil.file("test.xlsx"), 0);
//通过sheet名获取
reader = ExcelUtil.getReader(FileUtil.file("test.xlsx"), "sheet1");
读取大数据量的 Excel
private RowHandler createRowHandler() {
return new RowHandler() {
@Override
public void handle(int sheetIndex, int rowIndex, List<Object> rowlist) {
Console.log("[{}] [{}] {}", sheetIndex, rowIndex, rowlist);
}
};
}
ExcelUtil.readBySax("aaa.xlsx", 0, createRowHandler());
更多内容大家有时间的话,可以参阅 hutool 的官方文档学习。如果在开发过程中需要写轮子的时候不妨上 Hutool 文档看看,说不定已经有现成的轮子可以使用。大大节省我们的开发效率。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于