hutool工具包
# 难得糊涂
导入依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
# 定时任务
点击查看
cron.setting
# 我是注释 == com.company.aaa.job.TestJob.run = */10 * * * *
[com.hrbu.cron]
定时任务.Test = */10 * * * * *
package com.hrbu.cron;
import cn.hutool.core.lang.Console;
import cn.hutool.cron.CronUtil;
import cn.hutool.cron.task.Task;
import org.junit.Test;
/**
* 配置文件cron.setting
*/
public class 定时任务 {
@Test
public void Main() throws InterruptedException {
// 配置文件写法不需要调用就可以执行?
Test2();
Thread.currentThread().sleep(30000);
}
/**
* 定时任务
*/
public void Test() {
System.out.println("hello world!!!");
}
/**
* 动态添加定时任务
*/
public void Test2() {
CronUtil.schedule("*/2 * * * * *", new Task() {
@Override
public void execute() {
Console.log("Task excuted.");
}
});
// 支持秒级别定时任务
CronUtil.setMatchSecond(true);
CronUtil.start();
}
}
# 二维码工具
点击查看
<!-- 二维码依赖 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>${qrcode.version}</version>
</dependency>
package com.hrbu.extra;
import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import org.junit.Test;
public class 二维码工具 {
/**
* 生成二维码
*
* 也可以自行设置 1.样式(颜色,边距) 2.logo小图标 3.调整纠错级别
*/
@Test
public void Test() {
// 生成指定url对应的二维码到文件(也可以到流),宽和高都是300像素
QrCodeUtil.generate("http://aihb.top/", 300, 300, FileUtil.file("D:\\Program Files\\JetBrains\\project\\utils\\a_common\\qrcode.jpg"));
}
/**
* 识别二维码
*/
@Test
public void Test2() {
String decode = QrCodeUtil.decode(FileUtil.file("D:\\Program Files\\JetBrains\\project\\Utils\\a_common\\qrcode.jpg"));
System.out.println(decode);
}
}
# 邮件工具
点击查看
<!-- 邮件依赖 -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>${mail.version}</version>
</dependency>
mail.setting
# 发件人(必须正确,否则发送失败)
# from = hutool@yeah.net
from = 1714686225@qq.com
# 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助)
pass = mmmggnsqvstrdjhe
# 使用SSL安全连接
sslEnable = true
# 邮件服务器的SMTP端口,可选,默认25
port = 465 # 465 587
# 邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
# host = smtp.qq.com
# 用户名,默认为发件人邮箱前缀
# user = hutool
package com.hrbu.extra;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.mail.MailAccount;
import cn.hutool.extra.mail.MailUtil;
import org.junit.Test;
/**
* 配置文件mail.setting
*/
public class 邮件工具 {
/**
* 普通文本
*/
@Test
public void Test() {
MailUtil.send("xxx@qq.com", "测试", "邮件来自Hutool测试", false);
}
/**
* 群发
*/
@Test
public void Test2() {
MailUtil.send(CollUtil.newArrayList("xxx@qq.com", "zzz@qq.com"), "测试", "邮件来自Hutool测试", false);
}
/**
* html格式邮件,并增加附件 465端口
*/
@Test
public void Test3() {
MailUtil.send(CollUtil.newArrayList("xxx@qq.com"), "遮天", "遮天第一章", true, FileUtil.file("D:\\Program Files\\JetBrains\\project\\Utils\\a_common\\zt.txt"));
}
}
# Json工具
点击查看
package com.hrbu.io.json;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Test;
import java.io.File;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
public class Json相关 {
private String jsonStr = "{\"appId\":\"\",\"timestamp\":1642926098,\"nonceStr\":\"VLyigbixrv\",\"signature\":\"e57e0fdf59ce34efda440153656b72194d3bd9c5\",\"jsApiList\":[\"updateAppMessageShareData\",\"updateTimelineShareData\"]}";
/**
* java对象转为Json
*/
@Test
public void Test3() {
Student student = new Student("1", "ahb", "男", "24");
// javaBean转为json (不忽略空值)
JSONObject jsonObject = JSONUtil.parseObj(student, false);
System.out.println(JSONUtil.toJsonPrettyStr(jsonObject));
// jsonObject.setDateFormat("yyyy-MM-dd HH:mm:ss"); // 设置时间格式
}
/**
* XML字符串转换为JSON
* JSON转换为XML
*
* JSON转Bean
* readXXX : 从JSON文件中读取JSON对象的快捷方法
*/
@Test
public void Test2() {
// 从文件中读取
JSON json = JSONUtil.readJSON(new File("src/main/resources/test.json"), StandardCharsets.UTF_8);
// System.out.println(JSONUtil.toJsonPrettyStr(json));
System.out.println(JSONUtil.parseObj(json).getJSONArray("jsApiList"));
}
/**
* 根据字符串创建一个json对象
*/
@Test
public void Test() {
// 字符串解析
JSONObject json1 = JSONUtil.parseObj(jsonStr);
System.out.println(json1.getStr("timestamp"));
System.out.println(json1.getInt("timestamp"));
System.out.println(json1.getLong("timestamp"));
System.out.println(json1.getDouble("timestamp"));
System.out.println(json1.getBigDecimal("timestamp"));
// 格式化json(格式化JSON字符串,此方法并不严格检查JSON的格式正确与否)
System.out.println(JSONUtil.formatJsonStr(jsonStr));
// 转换为格式化后的JSON字符串
System.out.println(JSONUtil.toJsonPrettyStr(jsonStr));
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class Student{
private String id;
private String name;
private String sex;
private String age;
}
# 信息脱敏工具
点击查看
package com.hrbu.util;
import cn.hutool.core.util.DesensitizedUtil;
import org.junit.Test;
/**
* 现阶段支持的脱敏数据类型包括:
*
* 用户id
* 中文姓名
* 身份证号
* 座机号
* 手机号
* 地址
* 电子邮件
* 密码
* 中国大陆车牌,包含普通车辆、新能源车辆
* 银行卡
* 整体来说,所谓脱敏就是隐藏掉信息中的一部分关键信息,用*代替,自定义隐藏可以使用StrUtil.hide方法完成。
*/
public class 信息脱敏工具 {
/**
* 身份证号脱敏
*/
@Test
public void Test() {
String idCardNum = DesensitizedUtil.idCardNum("51343620000320711X", 1, 2);
System.out.println(idCardNum);
}
}
# 压缩工具
点击查看
package com.hrbu.util;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
import org.junit.Test;
import java.io.File;
import java.util.Collections;
import java.util.zip.ZipEntry;
public class 压缩工具 {
final String sourceFile = "D:\\Program Files\\JetBrains\\project\\Utils\\a_common\\zt.txt";
final String sourceFile2 = "D:\\Program Files\\JetBrains\\project\\Utils\\a_common\\num.csv";
final String tagFile = "D:\\Program Files\\JetBrains\\project\\Utils\\a_common\\all.zip";
final String tagFile2 = "D:\\Program Files\\JetBrains\\project\\Utils\\a_common\\all";
/**
* zip压缩
*/
@Test
public void Test() {
// ZipUtil.zip(sourceFile, tagFile);
File zip = ZipUtil.zip(FileUtil.file(tagFile), false,
FileUtil.file(sourceFile),
FileUtil.file(sourceFile2)); // 多文件或目录压缩
System.out.println(zip);
}
/**
* zip解压缩
*/
@Test
public void Test2() {
File unzip = ZipUtil.unzip(tagFile, tagFile2);
System.out.println(unzip);
}
/**
* Gzip是网页传输中广泛使用的压缩方式,Hutool同样提供其工具方法简化其过程。
* ZipUtil.gzip 压缩,可压缩字符串,也可压缩文件 ZipUtil.unGzip 解压Gzip文件
*
*
* ZipUtil.zlib 压缩,可压缩字符串,也可压缩文件 ZipUtil.unZlib 解压zlib文件
* 注意 ZipUtil默认情况下使用系统编码,也就是说:
* 如果你在命令行下运行,则调用系统编码(一般Windows下为GBK、Linux下为UTF-8)
* 如果你在IDE(如Eclipse)下运行代码,则读取的是当前项目的编码(详细请查阅IDE设置,我的项目默认都是UTF-8编码,因此解压和压缩都是用这个编码)
*/
}
# 唯一ID工具
点击查看
package com.hrbu.util;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import org.junit.Test;
public class 唯一ID工具 {
/**
* UUID
*/
@Test
public void Test() {
System.out.println(IdUtil.fastUUID()); // 带-的UUID
System.out.println(IdUtil.fastSimpleUUID()); // 不带-的UUID
}
/**
* ObjectId
* ObjectId是MongoDB数据库的一种唯一ID生成策略
*/
@Test
public void Test2() {
System.out.println(IdUtil.objectId());
}
/**
* 雪花算法
* 分布式系统中,有一些需要使用全局唯一ID的场景,有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。Twitter的Snowflake 算法就是这种生成器。
* 注意: IdUtil.createSnowflake每次调用会创建一个新的Snowflake对象,不同的Snowflake对象创建的ID可能会有重复,因此请自行维护此对象为单例,或者使用IdUtil.getSnowflake使用全局单例对象。
*/
@Test
public void Test3() {
// 参数1为终端ID
// 参数2为数据中心ID
Snowflake snowflake = IdUtil.getSnowflake(1, 2);
for (int i = 0; i < 200; i++) {
System.out.println(snowflake.nextId());
}
}
}
# 正则工具
点击查看
package com.hrbu.util;
import cn.hutool.core.util.ReUtil;
import org.junit.Assert;
import org.junit.Test;
import java.util.ArrayList;
public class 正则工具 {
private final String[] strs = {
"ZZZaaabbbccc中文1234",
"ZZZaaabbbccc中文1234,:345/"
};
/**
* 正则提取匹配到的数据
*/
@Test
public void Test() {
String str1 = ReUtil.extractMulti("(\\w+).*(\\d+)", strs[0], "$1\t$2"); // 提取出匹配到的内容
ArrayList<String> list = ReUtil.findAll("([\\u4e00-\\u9fa5]+)(\\d{2})", strs[0], 2, new ArrayList<String>()); //查找所有匹配文本(0所有 1第一个括号内 2第二个括号内)
Integer firstNumber = ReUtil.getFirstNumber(strs[1]); // 找到匹配到的第一段数字
boolean match = ReUtil.isMatch("\\w{12}.*\\d{4}", strs[0]); // 正则式是否完全匹配字符串
String str2 = ReUtil.replaceAll(strs[1], "(\\d+)", "($1)");// 将匹配到的部分替换为指定值
String str3 = ReUtil.escape("hello ${world}!!"); // 正则关键字转义
System.out.println(str1);
list.forEach(v -> System.out.printf(v + " "));
System.out.println();
System.out.println(firstNumber);
System.out.println(match);
System.out.println(str2);
System.out.println(str3);
// Assert.assertEquals("A-z", str);
}
/**
* 删除匹配到的内容
*/
@Test
public void Test2() {
String str1 = ReUtil.delFirst("\\w+", strs[0]); // 删除第一次匹配到的内容
String str2 = ReUtil.delFirst("[\\u4e00-\\u9fa5]+", strs[0]);
String str3 = ReUtil.delAll("[0-9]{1}", strs[0]); // 删除所有匹配到的内容
String str4 = ReUtil.delLast("[0-9]{1}", strs[0]); // 删除最后一次匹配到的内容
String str5 = ReUtil.delPre("[0-9]{1}", strs[0]); // 第一次匹配到字符之前的所有内容
System.out.println(str1 + "\n" + str2 + "\n" + str3 + "\n" + str4 + "\n" + str5 );
// Assert.assertEquals("A-z", str);
}
}
# 身份证工具
点击查看
package com.hrbu.util;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdcardUtil;
import org.junit.Assert;
import org.junit.Test;
public class 身份证工具 {
/**
* 身份证相关校验
*/
@Test
public void Main(){
String ID_18 = "321083197812162119";
String ID_15 = "150102880730303";
//是否有效
boolean valid = IdcardUtil.isValidCard(ID_18);
boolean valid15 = IdcardUtil.isValidCard(ID_15);
//转换
String convert15To18 = IdcardUtil.convert15To18(ID_15);
Assert.assertEquals(convert15To18, "150102198807303035");
//年龄
DateTime date = DateUtil.parse("2017-04-10");
int age = IdcardUtil.getAgeByIdCard(ID_18, date);
Assert.assertEquals(age, 38);
int age2 = IdcardUtil.getAgeByIdCard(ID_15, date);
Assert.assertEquals(age2, 28);
//生日
String birth = IdcardUtil.getBirthByIdCard(ID_18);
Assert.assertEquals(birth, "19781216");
String birth2 = IdcardUtil.getBirthByIdCard(ID_15);
Assert.assertEquals(birth2, "19880730");
//省份
String province = IdcardUtil.getProvinceByIdCard(ID_18);
Assert.assertEquals(province, "江苏");
String province2 = IdcardUtil.getProvinceByIdCard(ID_15);
Assert.assertEquals(province2, "内蒙古");
}
}
# EasyExcel工具类
# 代码实现过程
点击查看
<!-- start 学习Excel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<!-- end 学习Excel -->
1. 实体类
- 首先需要新建实体类,来将excel中每一行数据对应到一个对象中。
- 注解学习
- @HeadRowHeight(20) 设置行高
- @ColumnWidth(25) 设置列宽
- @ExcelProperty(value = "BAL_ID", index = 0) head名称、下标
- @ExcelIgnore 处理中忽略的列
- @DateTimeFormat("yyyy-MM-dd HH:mm:ss") 时间格式化
- @NumberFormat("#.##%") 接收百分比数据
2. 监听器
- 继承AnalysisEventListener<实体>类(重写其中两个方法)
- invoke 读取一条数据,执行一次该方法。可处理每一行数据
- doAfterAllAnalysed 读取结束后,执行一次该方法
3. 读取
MyDataReadListener myDataReadListener = new MyDataReadListener();
// 封装工作薄对象
ExcelReaderBuilder workBook = EasyExcel.read(sourceFile, MyData.class, myDataReadListener);
// 封装工作表对象
ExcelReaderSheetBuilder sheet = workBook.sheet();
// 读取
sheet.doRead();
return myDataReadListener.getAllData();
4. 自定义拦截器
- 可以用于指定特定单元格样式
- 这里实现了RowWriteHandler接口,重写afterRowDispose方法,将对比结果不同的单元格置上不同的前景色
需要了解的类或接口
WorkbookWriteHandler
SheetWriteHandler
RowWriteHandler
CellWriteHandler
DefaultWriteHandlerLoader
5. 写入
EasyExcel.write(tagFile, MyData.class)
.registerWriteHandler(new 自定义拦截器())
.sheet()
.doWrite(数据集(List));
编辑 (opens new window)
上次更新: 2022/08/21, 00:20:31