当前位置 : 首页 » 文章分类 :  开发  »  Hutool

Hutool

Hutool

https://hutool.cn/

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

阅读
评论
1.9k
阅读预计9分钟
创建日期 2023-08-28
修改日期 2024-04-24
类别
目录
  1. DateUtil
    1. formatDateTime() 格式化日期
    2. parse() 解析日期字符串
    3. offset/offsetSecond/offsetDay 日期时间加减
    4. between/betweenMs 计算时间差
    5. formatBetween() 格式化时间段
    6. beginOfDay/endOfDay 一天的开始/结束时间
  2. DatePattern
    1. NORM_DATETIME_FORMAT
    2. createFormatter
  3. NumberUtil
    1. div(float, float) 除法
    2. zero2One() 避免零除
  4. CharPool 字符池
    1. SLASH 斜杠
  5. StrPool 字符串池
    1. DOT 点
    2. COMMA 逗号
    3. UNDERLINE 下划线
    4. C_LF ‘\n’换行
    5. LF “\n”换行
    6. DOUBLE_QUOTES 双引号
  6. StrUtil
    1. NULL 字符串常量”null”
    2. cleanBlank() 删除空白
  7. BooleanUtil
    1. and bool数组与
    2. or bool数组取或
  8. ReUtil
    1. contains() 是否包含正则匹配的子串
    2. isMatch() 是否和正则完全匹配
    3. getGroup1() 获取group1内容
  9. PatternPool 常用正则常量池
  10. Convert
    1. convert(type, value) 类型转换
    2. chineseToNumber 中文转数字
      1. 含中文数字的字符串排序
  11. SpringUtil
    1. getBeansOfType() 从Spring上下文获取指定类型的Bean
  12. ServletUtil
    1. getHeaderMap() 获取全部header
  13. ThreadUtil
    1. sleep() 当前线程sleep
    2. createThreadFactory() 指定前缀创建线程工厂
  14. HttpUtil
    1. get() GET请求
  15. URLUtil
    1. encode()
  16. FileUtil
    1. exist(str/File) 判断文件(夹)是否存在
    2. del(str/File) 删除文件(夹)
    3. loopFiles() 遍历目录及子目录中文件
    4. readBytes(File) 读文件到字节数组
    5. writeFromStream() 输入流写入文件
  17. IoUtil
    1. toStream()
  18. ResourceUtil
    1. ResourceUtil 读取classpath文件
  19. ZipUtil
    1. zip() 压缩
    2. unzip() 解压
  20. CompressUtil
    1. createExtractor() 解压7zip/tar
  21. RuntimeUtil
  22. CollectionUtil/CollUtil
    1. distinct() 集合按指定字段去重
    2. reverse()/reverseNew() 反转列表
  23. IdUtil
    1. fastSimpleUUID() 无横线的uuid
  24. DigestUtil
    1. md5Hex() 十六进制MD5值
  25. SecureUtil
    1. md5()
  26. SmUtil
    1. SM2 解密
    2. SM3 杂凑
  27. MailUtil
  28. ExcelWriter
  29. PinyinUtil
    1. getPinyin 生成拼音
    2. getFirstLetter 生成拼音首字母
  30. CaptchaUtil
    1. createLineCaptcha 线段干扰的验证码

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论