Hutool 工具库常用功能
690人浏览 / 0人评论
参考:
http://tools.jbritian.com/link/n
hutool 文档:https://hutool.cn/docs/#/
依赖:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.15</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>1.72</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
HuToolTest.java
import cn.hutool.cache.Cache;
import cn.hutool.cache.CacheUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.thread.ExecutorBuilder;
import cn.hutool.core.thread.ThreadFactoryBuilder;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.extra.mail.MailAccount;
import cn.hutool.extra.mail.MailUtil;
import cn.hutool.http.HttpUtil;
import java.security.KeyPair;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.concurrent.*;
/**
* @Author FengHao
* @Date 2023/5/6
* @Description: HuTool 工具类库测试
**/
public class HuToolTest {
public static void main(String[] args) {
// 类型转换
typeConversion();
// 邮件
mail();
// 分布式唯一ID
uuid();
// http 请求
httpGet();
httpPost();
httpFile();
// 缓存
fifoCache();
// 控制台打印封装
console();
// 加密解密
encAndDec();
// 线程池
pool();
threadUtil();
}
public static void typeConversion() {
long[] b = {1, 2, 3, 4, 5};
//输出:"[1, 2, 3, 4, 5]"
String bStr = Convert.toStr(b);
System.err.println(bStr);
double a = 67556.32;
//输出:"陆万柒仟伍佰伍拾陆元叁角贰分"
String digitUppercase = Convert.digitToChinese(a);
System.err.println(digitUppercase);
}
public static void mail() {
// 在 classpath(标准 Maven 项目中为 src/main/resources)的 config 目录下新建 mail.setting 文件
//MailUtil.send("person1@bbb.com", "测试", "邮件来自Hutool测试", false);
// 群发
//ArrayList<String> tos = CollUtil.newArrayList(
// "person1@bbb.com",
// "person2@bbb.com",
// "person3@bbb.com",
// "person4@bbb.com");
//MailUtil.send(tos, "测试", "邮件来自Hutool群发测试", false);
// 附件
//MailUtil.send("hutool@foxmail.com", "测试", "<h1>邮件来自Hutool测试</h1>", true, FileUtil.file("d:/aaa.xml"));
// 重载服务器配置
//MailAccount account = new MailAccount();
//account.setHost("smtp.qq.com");
//account.setPort(25);
//account.setAuth(true);
//account.setFrom("xxxxx@qq.com");
//account.setUser("Hutool");
//account.setPass("xxxxx");
//MailUtil.send(account, CollUtil.newArrayList("person1@bbb.com"), "测试", "邮件来自Hutool测试", false);
}
public static void uuid() {
// Hutool 提供的唯一 ID 生成器的工具类,涵盖了:UUID、ObjectId(MongoDB)、Snowflake(Twitter)
//生成的UUID是带-的字符串,类似于:a5c8a5e8-df2b-4706-bea4-08d0939410e3
String uuid = IdUtil.randomUUID();
System.err.println(uuid);
//生成的是不带-的字符串,类似于:b17f24ff026d40949c85a24f4f375d42
String simpleUUID = IdUtil.simpleUUID();
System.err.println(simpleUUID);
}
public static void httpGet() {
// 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS
String result1 = HttpUtil.get("https://dict.youdao.com/suggest?num=5&ver=3.0&doctype=json&cache=false&le=en&q=boy");
System.err.println(result1);
// 当无法识别页面编码的时候,可以自定义请求页面的编码
String result2 = HttpUtil.get("https://dict.youdao.com/suggest?num=5&ver=3.0&doctype=json&cache=false&le=en&q=boy", CharsetUtil.CHARSET_UTF_8);
System.err.println(result2);
//可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("num", "5");
paramMap.put("ver", "3.0");
paramMap.put("doctype", "json");
paramMap.put("cache", "false");
paramMap.put("le", "en");
paramMap.put("q", "boy");
String result3 = HttpUtil.get("https://dict.youdao.com/suggest", paramMap);
System.err.println(result3);
}
public static void httpPost() {
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("keyfrom", "webdict");
paramMap.put("sign", "ce565ad30c100b2167ff40bc434c51ae");
paramMap.put("client", "web");
paramMap.put("t", "0");
paramMap.put("le", "en");
paramMap.put("q", "boy");
String result = HttpUtil.post("https://dict.youdao.com/jsonapi_s?doctype=json&jsonversion=4", paramMap);
System.err.println(result);
}
public static void httpFile() {
// 文件上传
HashMap<String, Object> paramMap = new HashMap<>();
//文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
paramMap.put("file", FileUtil.file("D:\\project_temp\\qiwenfile\\upload\\20230316\\827db3c57e060aa52acbb6a09e64e651.jpg"));
String result = HttpUtil.post("https://www.baidu.com", paramMap);
System.err.println(result);
}
/**
* Hutool 提供了常见的几种缓存策略的实现:
* FIFO(first in first out) :先进先出策略。
* LFU(least frequently used) :最少使用率策略。
* LRU(least recently used) :最近最久未使用策略。
* Timed :定时策略。
* Weak :弱引用策略。
* 并且,Hutool 还支持将小文件以 byte[] 的形式缓存到内容中,减少文件的访问,以解决频繁读取文件引起的性能问题。
*/
public static void fifoCache() {
Cache<String, String> fifoCache = CacheUtil.newFIFOCache(3);
//加入元素,每个元素可以设置其过期时长,DateUnit.SECOND.getMillis()代表每秒对应的毫秒数,在此为3秒
fifoCache.put("key1", "value1", DateUnit.SECOND.getMillis() * 3);
fifoCache.put("key2", "value2", DateUnit.SECOND.getMillis() * 3);
fifoCache.put("key3", "value3", DateUnit.SECOND.getMillis() * 3);
System.err.println("key1 = " + fifoCache.get("key1"));
System.err.println("key2 = " + fifoCache.get("key2"));
System.err.println("key3 = " + fifoCache.get("key3"));
System.err.println("");
//由于缓存容量只有3,当加入第四个元素的时候,根据FIFO规则,最先放入的对象将被移除
fifoCache.put("key4", "value4", DateUnit.SECOND.getMillis() * 3);
//value1为null
System.err.println("key1 = " + fifoCache.get("key1"));
System.err.println("key2 = " + fifoCache.get("key2"));
System.err.println("key3 = " + fifoCache.get("key3"));
System.err.println("key4 = " + fifoCache.get("key4"));
}
/**
* Hutool 封装了 Console 对象,Console 对象的使用更加类似于 Javascript 的 console.log() 方法,这也是借鉴了 JS 的一个语法糖。
*/
public static void console() {
String[] a = {"java", "c++", "c"};
//控制台输出:[java, c++, c]
Console.log(a);
//控制台输出:This is Console log for test.
Console.log("This is Console log for {}.", "test");
Console.log("This is Console log for more params: {}, {}.", "param1", "param2");
}
/**
* Hutool 支持对称加密、非对称加密、摘要加密、消息认证码算法、国密。
* 这里以国密为例,Hutool 针对Bouncy Castle做了简化包装,用于实现国密算法中的 SM2、SM3、SM4。
* 国密算法需要引入Bouncy Castle库的依赖:
* <dependency>
* <groupId>org.bouncycastle</groupId>
* <artifactId>bcprov-jdk15to18</artifactId>
* <version>1.69</version>
* </dependency>
*/
public static void encAndDec() {
String text = "JavaGuide:一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!";
System.out.println("原文:" + text);
KeyPair pair = SecureUtil.generateKeyPair("SM2");
// 公钥
byte[] privateKey = pair.getPrivate().getEncoded();
// 私钥
byte[] publicKey = pair.getPublic().getEncoded();
SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
// 公钥加密,私钥解密
String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
System.out.println("加密后:" + encryptStr);
String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
System.out.println("解密后:" + decryptStr);
//加签
String sign = sm2.signHex(HexUtil.encodeHexStr(text));
System.out.println("签名:" + sign);
//验签
boolean verify = sm2.verifyHex(HexUtil.encodeHexStr(text), sign);
System.out.println("验签:" + verify);
}
// Hutool 支持使用建造者的模式创建自定义线程池,这样看着更加清晰。
private static final ExecutorService pool = ExecutorBuilder.create()
.setCorePoolSize(10) //初始池大小
.setMaxPoolSize(20) //最大池大小
.setWorkQueue(new LinkedBlockingQueue<>(100)) //最大等待数为100
.setThreadFactory(ThreadFactoryBuilder.create().setNamePrefix("IM-Pool-").build()) //线程池命名
.build();
public static void pool() {
pool.execute(() -> {
System.err.println("info");
});
}
/**
* Hutool 提供一个全局的线程池,默认所有异步方法在这个线程池中执行。
* ThreadUtil.execute : 直接在公共线程池中执行线程
* ThreadUtil.execAsync: 执行异步方法
*/
public static void threadUtil() {
ThreadUtil.execute(() -> {
System.err.println("warn");
});
Future<Boolean> future = ThreadUtil.execAsync(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
System.err.println("success");
return true;
}
});
try {
System.err.println(future.get());
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
}
}
mail.setting
# 邮件服务器的SMTP地址
host = smtp.qq.com
# 邮件服务器的SMTP端口
port = 465
# 发件人(必须正确,否则发送失败)
from = xxxx@qq.com
# 用户名(注意:如果使用foxmail邮箱,此处user为qq号)
user = Hutool
# 密码(注意,某些邮箱需要为SMTP服务单独设置密码,详情查看相关帮助)
pass = xxxxxxxx
#使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。
starttlsEnable = true
# 使用SSL安全连接
sslEnable = true
# 指定实现javax.net.SocketFactory接口的类的名称,这个类将被用于创建SMTP的套接字
socketFactoryClass = javax.net.ssl.SSLSocketFactory
# 如果设置为true,未能创建一个套接字使用指定的套接字工厂类将导致使用java.net.Socket创建的套接字类, 默认值为true
socketFactoryFallback = true
# 指定的端口连接到在使用指定的套接字工厂。如果没有设置,将使用默认端口456
socketFactoryPort = 465
# SMTP超时时长,单位毫秒,缺省值不超时
timeout = 0
# Socket连接超时值,单位毫秒,缺省值不超时
connectionTimeout = 0
全部评论