Hutool
Hutool
https://github.com/dromara/hutool/
DateUtil
formatDateTime() 格式化日期
格式 yyyy-MM-dd HH:mm:ss
parse() 解析日期字符串
public static DateTime parse(CharSequence dateCharSequence)
支持几乎所有格式
yyyy-MM-dd HH:mm:ss
yyyy/MM/dd HH:mm:ss
yyyy.MM.dd HH:mm:ss
yyyy年MM月dd日 HH时mm分ss秒
yyyy-MM-dd
yyyy/MM/dd
yyyy.MM.dd
HH:mm:ss
HH时mm分ss秒
yyyy-MM-dd HH:mm
yyyy-MM-dd HH:mm:ss.SSS
yyyy-MM-dd HH:mm:ss.SSSSSS
yyyyMMddHHmmss
yyyyMMddHHmmssSSS
yyyyMMdd
EEE, dd MMM yyyy HH:mm:ss z
EEE MMM dd HH:mm:ss zzz yyyy
yyyy-MM-dd'T'HH:mm:ss'Z'
yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
yyyy-MM-dd'T'HH:mm:ssZ
yyyy-MM-dd'T'HH:mm:ss.SSSZ
offset/offsetSecond/offsetDay 日期时间加减
public static DateTime offset(Date date, DateField dateField, int offset)
public static DateTime offsetSecond(Date date, int offset) // offset – 偏移秒数,正数向未来偏移,负数向历史偏移
public static DateTime offsetDay(Date date, int offset)
between/betweenMs 计算时间差
public static long between(Date beginDate, Date endDate, DateUnit unit)
public static long betweenMs(Date beginDate, Date endDate)
formatBetween() 格式化时间段
XX天XX小时XX分XX秒XX毫秒
public static String formatBetween(Date beginDate, Date endDate)
public static String formatBetween(long betweenMs)
beginOfDay/endOfDay 一天的开始/结束时间
public static DateTime beginOfDay(Date date)
public static DateTime endOfDay(Date date)
DatePattern
NORM_DATETIME_FORMAT
// yyyyMMddHHmmss
PURE_DATETIME_FORMAT.format(new Date())
createFormatter
DatePattern.createFormatter(“MMdd”).format(LocalDateTime.now())
NumberUtil
div(float, float) 除法
除数都使用 zero2One() 处理下,避免零除
int a = 5;
int b = 0;
float divt = NumberUtil.div(a, NumberUtil.zero2One(b));
zero2One() 避免零除
如果给定值为0,返回1,否则返回原值
public static int zero2One(int value) {
return 0 == value ? 1 : value;
}
CharPool 字符池
SLASH 斜杠
StrPool 字符串池
DOT 点
COMMA 逗号
UNDERLINE 下划线
C_LF ‘\n’换行
LF “\n”换行
DOUBLE_QUOTES 双引号
StrUtil
NULL 字符串常量”null”
public static final String NULL = “null”;
cleanBlank() 删除空白
BooleanUtil
and bool数组与
public static boolean and(boolean… array)
or bool数组取或
public static boolean or(boolean… array)
ReUtil
ReUtil 内部是有 Pattern 缓存的,重复使用 字符串 正则也不会重复编译。
contains() 是否包含正则匹配的子串
public static boolean contains(Pattern pattern, CharSequence content) {
if (null == pattern || null == content) {
return false;
}
return pattern.matcher(content).find();
}
isMatch() 是否和正则完全匹配
public static boolean isMatch(Pattern pattern, CharSequence content) {
if (content == null || pattern == null) {
// 提供null的字符串为不匹配
return false;
}
return pattern.matcher(content).matches();
}
getGroup1() 获取group1内容
public static String getGroup1(Pattern pattern, CharSequence content)
返回正则匹配中分组1的内容,未匹配返回null
PatternPool 常用正则常量池
正则大全
https://any86.github.io/any-rule/
Convert
convert(type, value) 类型转换
chineseToNumber 中文转数字
一百一十二 -> 112
一千零一十二 -> 1012
含中文数字的字符串排序
基于 chineseToNumber 实现含中文数字的字符串 转 阿拉伯数字,用于排序
private static final Pattern PATTERN = Pattern.compile("([零一二三四五六七八九十百千万亿]+)");
/**
* 包含中文数字的字符串转数字,第十五条 -> 15
* @param str
* @return
*/
public static long chineseToNumber(String str) {
Matcher matcher = PATTERN.matcher(str);
if (matcher.find()) {
return Convert.chineseToNumber(matcher.group(1));
}
return 0;
}
@Test
public void test() {
List<String> list = Arrays.asList("第三十章", "XX二百三十局", "第一编", "最后一千零二个", "一千零一夜");
list.sort(Comparator.comparing(ChineseNumberTest::chineseToNumber));
for (String str : list) {
System.out.println(str);
}
}
结果:
第一编
第三十章
XX二百三十局
一千零一夜
最后一千零二个
SpringUtil
getBeansOfType() 从Spring上下文获取指定类型的Bean
hutool-all 包的 spring.factories 中启用了 SpringUtil 自动配置,可无需注入直接使用 SpringUtil.getBean
ServletUtil
getHeaderMap() 获取全部header
public static Map<String, String> getHeaderMap(HttpServletRequest request)
ThreadUtil
sleep() 当前线程sleep
createThreadFactory() 指定前缀创建线程工厂
HttpUtil
get() GET请求
URLUtil
encode()
java.net.URLEncoder 会把所有特殊字符包括:和/都编码,带中文的连接编码后无法访问。
cn.hutool.core.util.URLUtil.encode() 可实现只编码中文和空格,不编码 http://
FileUtil
exist(str/File) 判断文件(夹)是否存在
del(str/File) 删除文件(夹)
loopFiles() 遍历目录及子目录中文件
public static List<File> loopFiles(File file, FileFilter fileFilter)
public static List<File> loopFiles(File file, int maxDepth, FileFilter fileFilter)
maxDepth 遍历最大深度,-1表示遍历到没有目录为止
readBytes(File) 读文件到字节数组
public static byte[] readBytes(File file) throws IORuntimeException
public static byte[] readBytes(String filePath) throws IORuntimeException
writeFromStream() 输入流写入文件
public static File writeFromStream(InputStream in, File dest) throws IORuntimeException
public static File writeFromStream(InputStream in, String fullFilePath) throws IORuntimeException
IoUtil
toStream()
public static ByteArrayInputStream toStream(byte[] content)
ResourceUtil
ResourceUtil 读取classpath文件
读取 classpath 下的文件
String str = ResourceUtil.readUtf8Str("test.xml");
byte[] bytes = ResourceUtil.readBytes("test.xml");
ZipUtil
zip() 压缩
unzip() 解压
public static File unzip(File zipFile, File outFile) throws UtilException
public static File unzip(InputStream zipInputStream, File outFile, Charset charset) throws UtilException
示例,解压 zip 到输出目录:
try (
InputStream inputStream = new FileInputStream("/path-to/压缩.zip")
) {
ZipUtil.unzip(inputStream, outDir, StandardCharsets.UTF_8);
List<File> files = FileUtil.loopFiles(outDir, -1, DOC_FILTER);
files.forEach(file -> System.out.println(file.getName()));
} catch (Exception e) {
log.error("解压缩失败", e);
}
CompressUtil
createExtractor() 解压7zip/tar
示例,解压 tar 到输出目录:
Extractor extractor = CompressUtil.createExtractor(StandardCharsets.UTF_8, new File("/data/xxx.tar"));
extractor.extract(new File("/data/outDir"));
RuntimeUtil
CollectionUtil/CollUtil
distinct() 集合按指定字段去重
public static <T, K> List<T> distinct(Collection<T> collection, Function<T, K> uniqueGenerator, boolean override)
override=true 有重复时保留后面的,删除前面的
override=false 有重复时保留前面的,删除后面的
例如 users 列表按 name 去重
List<User> users = CollectionUtil.distinct(users, User::getName, true);
reverse()/reverseNew() 反转列表
public static <T> List<T> reverse(List<T> list) // 反序给定List,会在原List基础上直接修改
public static <T> List<T> reverseNew(List<T> list) // 反序给定List,会创建一个新的List,原List数据不变
IdUtil
fastSimpleUUID() 无横线的uuid
DigestUtil
md5Hex() 十六进制MD5值
public static String md5Hex(byte[] data)
public static String md5Hex(String data)
public static String md5Hex(File file)
public static String md5Hex(InputStream data)
SecureUtil
md5()
SmUtil
SM2 解密
private String sm2Decrypt(String encrypted) {
SM2 sm2 = SmUtil.sm2(sm2PrivateKey("私钥"), "公钥");
return new String(sm2.decryptFromBcd(sm2EncryptedText(encrypted), KeyType.PrivateKey));
}
// 私钥前加00
private String sm2PrivateKey(String privateKey) {
return "00" + privateKey;
}
// 密文前加04
private String sm2EncryptedText(String cipherText) {
return "04" + cipherText;
}
SM3 杂凑
SmUtil.sm3(content);
MailUtil
1、除了 hutoo-all,还需要单独引入 mail 依赖
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
2、maven 项目 src/main/resources 中新建 mail.setting
# 发件人(必须正确,否则发送失败)
from = hutool@yeah.net
# 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助)
pass = q1w2e3
3、发邮件
// 发送文本邮件
MailUtil.send("hutool@foxmail.com", "测试", "邮件来自Hutool测试", false);
// 发送html邮件
MailUtil.send("hutool@foxmail.com", "测试", "<h1>邮件来自Hutool测试</h1>", true, FileUtil.file("d:/aaa.xml"));
ExcelWriter
1、需要额外引入 POI 依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.1.0</version>
</dependency>
2、生成或写入 excel
List<String> titleRow = Lists.newArrayList("第一列", "第二列", "第三列");
List<List<String>> excelRows = Lists.newArrayList();
excelRows.add(titleRow);
try (
InputStream inputStream = new FileInputStream(jsonlFile);
ExcelWriter excelWriter = ExcelUtil.getWriter(excelFile) // 自动close时才真正创建并写入excel
) {
excelRows.add(Lists.newArrayList("a", "b", "c"));
excelWriter.write(excelRows); // 写入excel
} catch (Exception e) {
log.error("write excel error", e);
}
PinyinUtil
使用PinyinUtil类时需要引入一个第三方的拼音库。例如pinyin4j、TinyPinyin、jpinyin,否则报错:
Caused by: cn.hutool.extra.pinyin.PinyinException: No pinyin jar found ! Please add one of it to your project !
建议 TinyPinyin https://github.com/promeG/TinyPinyin
<dependency>
<groupId>io.github.biezhi</groupId>
<artifactId>TinyPinyin</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
getPinyin 生成拼音
getFirstLetter 生成拼音首字母
CaptchaUtil
createLineCaptcha 线段干扰的验证码
上一篇 H2
下一篇 JsonPath
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: