今天向大家推荐一款国产良心工具包 -- Hutool,让你的java变得更甜
一、简介
Hutool是国内程序员在工作中总结和积累而成的一套小而全的工具类库,相比于Guava,它更符合国内开发者的需求。
Hutool首次发布于2014年,最新版本为5.8.0,到目前为止已经在github上收获了2.2万个赞。
我们还是先来看一下学习Hutool的思维导图。
二、常用API
下面列举一些常用的api
1. 基础工具
1.1 日期时间处理
日期操作的亮点是可以通过ChineseDate类将公历日期转换为农历日期。此外,使用DateUtil可以很方便的操作Date类型数据,LocalDateTimeUtil则用于操作LocalDateTime类型数据。
// 获取年份
int year = DateUtil.year(new Date());// 获取今天日期 yyyy-MM-dd格式
String today = DateUtil.today();// 获取生肖
String chineseZodiac = DateUtil.getChineseZodiac(1990);// 将毫秒转成方便阅读的时间,如3小时25分23秒232毫秒
String readableTime = DateUtil.formatBetween(12323232);// 转为农历日期
ChineseDate chineseDate = new ChineseDate(new Date());
// 农历年份,如2021
final int chineseYear = chineseDate.getChineseYear();
// 农历月份,如腊月
final String chineseMonthName = chineseDate.getChineseMonthName();
// 农历日期,如初三
final String chineseDay = chineseDate.getChineseDay();// 方便地将Date转换为LocalDateTime
final LocalDateTime localDateTime = LocalDateTimeUtil.of(new Date());// 获取一天开始时间
LocalDateTimeUtil.beginOfDay(localDateTime);
// 获取一天结束时间
LocalDateTimeUtil.endOfDay(localDateTime);
1.2 I/O
IoUtils可以方便地复制文件,其他相关api建议使用jdk的Files工具类。
// 从文件中获取缓冲流
BufferedInputStream in = FileUtil.getInputStream("d:/test.txt");
BufferedOutputStream out = FileUtil.getOutputStream("d:/test2.txt");// 拷贝文件
IoUtil.copy(in, out);
1.3 字符串处理
一些简单易用的字符串处理api,以及正则表达式的api。
// 判断字符串是否为null或空串
boolean isEmpty = StrUtil.isEmpty(str);// 判断字符串是否为null或空串或空白字符
boolean isBlank = StrUtil.isBlank(str);// 将字符串用指定字符填充到指定长度
String filled = StrUtil.fillAfter(str, '*', 10);// 填充字符串模板
String format = StrUtil.format("a的值为{a}, b的值为{b}", Map.of("a", "aValue", "b", "bValue"));// 判断字符串是否为中文字符串
boolean match = ReUtil.isMatch(ReUtil.RE_CHINESES, "中国人");
1.4 集合框架
可以用于创建集合和集合的交、并、差集操作。
// 新建一个HashSet
Set<Integer> hashSet = CollUtil.newHashSet(1, 2, 3);
Set<Integer> linkedHashSet = CollUtil.newLinkedHashSet(4, 2, 3);// 两个集合取交集
Collection<Integer> intersection = CollUtil.intersection(hashSet, linkedHashSet);// 两个集合取并集
Collection<Integer> union = CollUtil.union(hashSet, linkedHashSet);// 两个集合取差集
Collection<Integer> disjunction = CollUtil.disjunction(hashSet, linkedHashSet);// 判断一个集合是否为null或空集
boolean empty = CollUtil.isEmpty(hashSet);// 创建一个ArrayList
List<Integer> arrayList = ListUtil.toList(1, 2, 3);// 创建一个LinkedList
List<Integer> linkedList = ListUtil.toLinkedList(1, 2, 3);// 创建一个map
Map<String, Object> map = MapUtil.<String, Object>builder().put("a", 1).put("b", 2).build();
1.5 常见业务
身份证、社会信用代码、拼音操作、生成二维码、生成唯一ID等一些常见业务场景api。
// 根据身份证号获取出生日期
String birth = IdcardUtil.getBirthByIdCard(idCard);// 根据身份证号获取省份
String province = IdcardUtil.getProvinceByIdCard(idCard);// 判断身份证号是否合法
boolean valid = IdcardUtil.isValidCard18(idCard);// 获取一个随机的社会信用代码
String creditCode = CreditCodeUtil.randomCreditCode();// 判断社会信用代码是否合法
boolean isCreditCode = CreditCodeUtil.isCreditCode(creditCode);// 将汉字转为拼音,需要引入TinyPinyin、JPinyin或Pinyin4j的jar包
String china = PinyinUtil.getPinyin("中国");// 将字符串生成为二维码,需要引入com.google.zxing.core的jar包
BufferedImage qrCodeImage = QrCodeUtil.generate("www.baidu.com", QrConfig.create());
ImageIO.write(qrCodeImage, "png", new File("a.png"));// 生成uuid
String uuid = IdUtil.fastSimpleUUID();// 创建基于Twitter SnowFlake算法的唯一ID,适用于分布式系统
final Snowflake snowflake = IdUtil.createSnowflake(1, 1);
final long id = snowflake.nextId();
2. 定时任务
通过简单的api,实现全局统一的定时任务调度
// 添加新的定时任务
final String scheduleId = CronUtil.schedule("*/2 * * * * *", (Task) () -> System.out.println("执行定时任务"));// 设置是否支持秒级别定时任务
CronUtil.setMatchSecond(true);// 开启定时任务
CronUtil.start();
3. 验证码
可以方便地生成图形验证码。
// 生成线段干扰的验证码
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100, 5, 3);
lineCaptcha.write("/your/path/b.png");// 生成圆圈干扰的验证码
CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 20);
captcha.write("/your/path/c.png");// 生成扭曲干扰的验证码
ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(200, 100, 4, 4);
shearCaptcha.write("/your/path/d.png");
4. 缓存
可以方便地使用基于内存的缓存,并设置过期时间的策略。
// 创建先进先出的缓存,并设置过期时间
FIFOCache<String, Object> cache = CacheUtil.newFIFOCache(1000, 3600 * 1000);// 向缓存中添加元素
cache.put("a", 1);// 从缓存中读取元素
cache.get("a");
5. Excel操作
// 将文件转换为ExcelReader
ExcelReader reader = ExcelUtil.getReader("d:/aaa.xlsx");// 读取所有行和列的数据
List<List<Object>> data = reader.read();// 读取为Map列表,默认excel第一行为标题行,Map中的key为标题,value为标题对应的单元格值。
List<Map<String,Object>> dataMap = reader.readAll();//创建writer
ExcelWriter writer = ExcelUtil.getWriter("d:/bbb.xlsx");// 数据量特别大时,使用BigExcelWriter对象,可以避免内存溢出
ExcelWriter bigWriter = ExcelUtil.getBigWriter("d:/bbb.xlsx");// 构造数据
List<String> row1 = CollUtil.newArrayList("aa", "bb", "cc", "dd");
List<String> row2 = CollUtil.newArrayList("aa1", "bb1", "cc1", "dd1");
List<String> row3 = CollUtil.newArrayList("aa2", "bb2", "cc2", "dd2");
List<String> row4 = CollUtil.newArrayList("aa3", "bb3", "cc3", "dd3");
List<String> row5 = CollUtil.newArrayList("aa4", "bb4", "cc4", "dd4");
List<List<String>> rows = CollUtil.newArrayList(row1, row2, row3, row4, row5);// 一次性将数据写入excel中
writer.write(rows, true);
6. Http请求
Map<String, Object> params = MapUtil.<String, Object>builder().put("a", 1).build();
// 发送get请求
String getResult = HttpUtil.get("https://www.baidu.com", params);// 发送post请求
String postResult = HttpUtil.post("https://www.baidu.com", params);// 以application/json方式发送post请求
String jsonPostResult = HttpUtil.post("https://www.baidu.com", JSON.toJSONString(params));// 下载文件,提供生命周期钩子
HttpUtil.downloadFile(fileUrl, FileUtil.file("e:/"), new StreamProgress() {@Overridepublic void start() {System.out.println("开始下载");}@Overridepublic void progress(long progressSize) {System.out.println("下载中,已下载" + FileUtil.readableFileSize(progressSize));}@Overridepublic void finish() {System.out.println("下载完成");}
});
7. 加密
7.1 加密和解密
// md5摘要加密
String md5 = SecureUtil.md5("abc");// sha1摘要加密
String sha1 = SecureUtil.sha1("abc");// 生成非对称密钥对
KeyPair keyPair = SecureUtil.generateKeyPair("RSA");
String publicKey = Base64Encoder.encode(keyPair.getPublic().getEncoded());
String privateKey = Base64Encoder.encode(keyPair.getPrivate().getEncoded());// 利用公钥加密
String encryptBase64 = SecureUtil.rsa(privateKey, publicKey).encryptBase64("abc", KeyType.PublicKey);// 利用私钥解密
String decrypt = new String(SecureUtil.rsa(privateKey, publicKey).decrypt(encryptBase64, KeyType.PrivateKey));
7.2 签名和验签
// 创建签名对象
Sign sign = SecureUtil.sign(SignAlgorithm.MD5withRSA);// 生成签名
final byte[] bytes = "abc".getBytes();
byte[] signed = sign.sign(bytes);// 验证签名
boolean verify = sign.verify(bytes, signed);
System.out.println(verify);
8. 后记
8.1 引入Hutool
在项目中可以通过maven引入Hutool库,方式如下:
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.6.5</version>
</dependency>
8.2 注意事项
Hutool的定位是减少代码搜索成本,避免从网络上复制修改代码导致的潜在问题。
所有的类都有自己的使用场景,没有银弹。应该多读使用文档,看这些工具是否符合自己的使用场景。
本文仅列举了部分常用api,整个工具包的内容非常广泛。如有需要,可到官网进一步深入学习。
今天向大家推荐一款国产良心工具包 -- Hutool,让你的java变得更甜相关推荐
- 真无线蓝牙耳机品牌排行榜, 四款国产良心蓝牙耳机
真无线蓝牙耳机品牌排行榜, 四款国产良心蓝牙耳机 现在有线耳机已经是英雄迟暮了,称霸市场的当属现在的真无线蓝牙耳机.目前无线蓝牙耳机市场中,国产蓝牙耳机已经具备可以和国外大牌抗衡的实力了,面对国外大牌 ...
- 推荐一款国产ECG心电芯片
现如今,许多病人的心脏病信号往往不发生在就诊时,从而为心脏病的诊断与预判带来了很大的困难.心电监测芯片技术可随时随地监测人体的健康状况,并且能够灵活应用在智能手表/手环.服饰.耳机等产品上,这一技术能 ...
- 强烈推荐一款国产物联网实时操作系统RT-Thread
文章目录 强烈推荐一款国产物联网实时操作系统RT-Thread RT-Thread 的架构 实操一把 准备工作 下载RT-Thread Simulator 例程 系统启动代码 用户入口代码 跑马灯的例 ...
- 扩展坞可以把手机投到显示器吗_你真的会用手机吗?这款ORICO多功能扩展坞可以让手机变的更强大...
原标题:你真的会用手机吗?这款ORICO多功能扩展坞可以让手机变的更强大 现如今科技越来越发达,手机也早已变的不仅仅是通讯工具那么简单,可以说我们一天生活.工作.学习中的许多事物都已经离不开手机.正因 ...
- 给你安利一款国产良心软件uTools
前言 大家好,我是xiezhr 最近由于换了新电脑,也是在各种折腾搭建开发环境,安装各种常用软件.今天呢给大家安利一款你可能没用过的国产良心软件uTools,这也是我刚刚拿到电脑后安装的第一款软件吧. ...
- 8款国产良心软件,一款比一款适用,请大家低调使用
之前给大家分享的电脑软件,很多都是国外的,那么今天我就给大家分享8个国产良心软件,款款百里挑一,还请低调使用. 阅读引导: 01*桌面日历有条不紊地管理自己每天的工作计划,一款优秀的桌面日历必不可少! ...
- 免费的XShell替代品,又来一款国产良心工具....
今日推荐为啥查询那么慢? 后端接口如何提高性能? 16 个写代码的好习惯 为什么不推荐使用BeanUtils属性转换工具 盘点阿里巴巴 34 个牛逼 GitHub 项目 常见代码重构技巧(非常实用) ...
- 4款国产良心软件,完全免费,其中两款一直被误认为外国人开发
1.知犀思维导图 使用思维导图梳理复杂事项,可以大幅度提升我们的工作效率.市面上大多的思维导图工具,要么使用体验不好,要么收费高. 唯独知犀思维导图让我看到国产软件的良心,它的所有功能完全免费,没有任 ...
- 免费的XShell替代品,同时支持Windows,macOS,Linux!又来一款国产良心工具....
来源:toutiao.com/i6694563184428188171 引言 FinalShell是一款免费的国产的集SSH工具.服务器管理.远程桌面加速的良心软件,同时支持Windows,macOS ...
最新文章
- C#操作Excel导入导出
- PHP复杂度,php 算法复杂度 时间复杂度 空间复杂度
- 洛谷P1937 [USACO10MAR]仓配置Barn Allocation
- 1.UNIX网络编程卷1:源码配置
- 解密:90后程序员青睐哪些互联网公司?
- 向左向右向后转python_Turbot与python教程-实现左向旋转
- open一个绝对路径地址 python_实例15:用Python批量转换doc文件为docx文件
- 【java】java getOrDefault 方法的一个坑,容易导致OOM
- mysql期中考试题及答案_MySQL数据库考试试题与答案
- python flask api部署_使用flask开发api——部署flask,使用gunicorn+gevent模式的http server...
- 【动态规划】XMU 1028 Game Boy Advance
- 解决:git push error: failed to push some refs to
- linux内核虚拟内存之物理内存
- 热敏电阻温度计算 公式 程序
- 傅里叶变换的意义和理解(通俗易懂)
- Google 正式开源 Paranoid
- 了解前沿信息科技 做好学习就业规划
- 伦斯勒理工大学计算机专业好申请吗,只要达到标准,申请伦斯勒理工学院就不是一件困难的事情!...
- 掘金「跳转外链风险提示」实现思考
- uva10859放置街灯(树形dp)