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

全部评论