• 干掉复杂的工具类,国产Java工具类库 Hutool 很香!


    Hutool 大家已经比较熟悉了,这是一个超全的 Java 工具库,深受国内开发者的喜爱。

    我之前其实是不太喜欢使用这种功能太多的工具类的,也比较担心稳定性和安全性,后面慢慢接受了就感觉其实也还好。而且,我们还可以按需只引入自己需要的功能模块,相对也比较灵活。

    Hutool 的官方文档介绍的已经比较清晰了,奈何其提供的功能实在太多,我这里列举一些我个人觉得比较实用的功能,供大家学习参考。

    Hutool 介绍

    Hutool 真心是一个不错的国产 Java 工具类库,功能全面,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行了封装,开箱即用!

    官方是这样介绍 Hutool 的:

    Hutool 介绍

    Hutool 包含的组件以及组件提供的功能如下表所示:

    Hutool 包含的组件

    你可以根据项目需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块。不过,还是不建议引入所有模块,因为绝大部分功能项目可能都用不上,建议只引入你需要的模块。

    另外,Hutool 也有一个比较明显的缺点,很多功能实现的比较简单比如图片验证码、Excel 工具类,很可能无法满足项目的实际需求。像这样情况,还是建议你选择在某一方面更优秀的工具库比如 Excel 工具库MyExcel、EasyExcel、图片处理库Imglib。

    Hutool 实战

    引入依赖

    Maven 仓库地址:https://mvnrepository.com/artifact/cn.hutool

    这里为了方便,我们直接引入所有模块,实际项目中还是建议只引入自己需要的模块。

    Maven:

    <dependency>
        <groupId>cn.hutoolgroupId>
        <artifactId>hutool-allartifactId>
        <version>5.8.16version>
    dependency>
    

    Gradle:

    implementation 'cn.hutool:hutool-all:5.8.16'
    

    功能演示

    Hutool 提供的功能实在太多,这里只列举一些我个人觉得比较实用的功能,供大家学习参考。

    类型转换

    Convert 类封装了针对Java常见类型的转换。

    long[] b = {1,2,3,4,5};
    String bStr = Convert.toStr(b);//"[1, 2, 3, 4, 5]"
    
    double a = 67556.32;
    String digitUppercase = Convert.digitToChinese(a);//"陆万柒仟伍佰伍拾陆元叁角贰分"
    

    邮件

    在 Java 中发送邮件主要品依靠 javax.mail 包,但是由于使用比较繁琐,因此 Hutool 针对其做了封装。

    在classpath(在标准Maven项目中为src/main/resources)的config目录下新建mail.setting文件,完整配置如下(邮件服务器必须支持并打开SMTP协议):

    # 邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
    host = smtp.yeah.net
    # 邮件服务器的SMTP端口,可选,默认25
    port = 25
    # 发件人(必须正确,否则发送失败)
    from = hutool@yeah.net
    # 用户名,默认为发件人邮箱前缀
    user = hutool
    # 密码(注意,某些邮箱需要为SMTP服务单独设置授权码,详情查看相关帮助)
    pass = q1w2e3
    

    发送邮件非常简单:

    MailUtil.send("hutool@foxmail.com", "测试", "邮件来自Hutool测试", false);
    

    支持群发:

    ArrayList 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", "测试", "

    邮件来自Hutool测试

    "
    , true, FileUtil.file("d:/aaa.xml"));

    除了使用配置文件定义全局账号以外,MailUtil.send方法同时提供重载方法可以传入一个MailAccount对象,这个对象为一个普通Bean,记录了邮件服务器信息。

    MailAccount account = new MailAccount();
    account.setHost("smtp.yeah.net");
    account.setPort("25");
    account.setAuth(true);
    account.setFrom("hutool@yeah.net");
    account.setUser("hutool");
    account.setPass("q1w2e3");
    
    MailUtil.send(account, CollUtil.newArrayList("hutool@foxmail.com"), "测试", "邮件来自Hutool测试", false);
    

    唯一 ID

    在分布式环境中,唯一 ID 生成应用十分广泛,生成方法也多种多样,Hutool 针对一些常用生成策略做了简单封装。

    Hutool 提供的唯一 ID 生成器的工具类,涵盖了:

    • UUID
    • ObjectId(MongoDB)
    • Snowflake(Twitter)

    拿 UUID 举例!

    Hutool 重写java.util.UUID的逻辑,对应类为cn.hutool.core.lang.UUID,使生成不带-的 UUID 字符串不再需要做字符替换,性能提升一倍左右

    //生成的UUID是带-的字符串,类似于:a5c8a5e8-df2b-4706-bea4-08d0939410e3
    String uuid = IdUtil.randomUUID();
    
    //生成的是不带-的字符串,类似于:b17f24ff026d40949c85a24f4f375d42
    String simpleUUID = IdUtil.simpleUUID();
    

    HTTP 请求工具类

    针对最为常用的 GET 和 POST 请求,HttpUtil 封装了两个方法,

    • HttpUtil.get
    • HttpUtil.post

    GET请求:

    // 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS
    String result1= HttpUtil.get("https://www.baidu.com");
    
    // 当无法识别页面编码的时候,可以自定义请求页面的编码
    String result2= HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);
    
    //可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
    HashMap paramMap = new HashMap<>();
    paramMap.put("city", "北京");
    
    String result3= HttpUtil.get("https://www.baidu.com", paramMap);
    

    POST请求:

    HashMap paramMap = new HashMap<>();
    paramMap.put("city", "北京");
    
    String result= HttpUtil.post("https://www.baidu.com", paramMap);
    

    文件上传:

    HashMap paramMap = new HashMap<>();
    //文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
    paramMap.put("file", FileUtil.file("D:\\face.jpg"));
    
    String result= HttpUtil.post("https://www.baidu.com", paramMap);
    

    缓存

    Hutool 提供了常见的几种缓存策略的实现:

    1. FIFO(first in first out) :先进先出策略。
    2. LFU(least frequently used) :最少使用率策略。
    3. LRU(least recently used) :最近最久未使用策略。
    4. Timed :定时策略。
    5. Weak :弱引用策略。

    并且,Hutool 还支持将小文件以 byte[] 的形式缓存到内容中,减少文件的访问,以解决频繁读取文件引起的性能问题。

    FIFO(first in first out) 策略缓存使用:

    Cache 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);
    
    //由于缓存容量只有3,当加入第四个元素的时候,根据FIFO规则,最先放入的对象将被移除
    fifoCache.put("key4", "value4", DateUnit.SECOND.getMillis() * 3);
    
    //value1为null
    String value1 = fifoCache.get("key1");
    

    控制台打印封装

    一般情况下,我们打印信息到控制台小伙伴们应该再熟悉不过了!

    System.out.println("Hello World");
    

    但是,这种方式不满足很多场景的需要:

    1. 不支持参数,对象打印需要拼接字符串
    2. 不能直接打印数组,需要手动调用Arrays.toString

    为此,Hutool 封装了Console对象。

    Console对象的使用更加类似于 Javascript 的console.log()方法,这也是借鉴了 JS 的一个语法糖。

    String[] a = {"java", "c++", "c"};
    Console.log(a);//控制台输出:[java, c++, c]
    
    Console.log("This is Console log for {}.", "test");//控制台输出:This is Console log for test.
    

    加密解密

    Hutool 支持对称加密、非对称加密、摘要加密、消息认证码算法、国密。

    这里以国密为例,Hutool针对Bouncy Castle做了简化包装,用于实现国密算法中的SM2、SM3、SM4。

    国密算法需要引入Bouncy Castle库的依赖:

    <dependency>
        <groupId>org.bouncycastlegroupId>
        <artifactId>bcprov-jdk15to18artifactId>
        <version>1.69version>
    dependency>
    

    SM2 使用自定义密钥对加密或解密

    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);
    
    

    SM2 签名和验签

    //加签
    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 ExecutorService pool = ExecutorBuilder.create()
                  .setCorePoolSize(10)//初始池大小
                  .setMaxPoolSize(20) //最大池大小
                  .setWorkQueue(new LinkedBlockingQueue<>(100))//最大等待数为100
                  .setThreadFactory(ThreadFactoryBuilder.create().setNamePrefix("IM-Pool-").build())// 线程池命名
                  .build();
    

    实际项目中,如果一个对象的属性比较多,有限考虑使用建造者模式创建对象。

    并且,Hutool 还提供一个全局的线程池,默认所有异步方法在这个线程池中执行。

    • ThreadUtil.execute : 直接在公共线程池中执行线程
    • ThreadUtil.execAsync: 执行异步方法
    • ......

    Hutool 自身就大量用到了 ThreadUtil,比如敏感词工具类 SensitiveUtil

    public static void init(final Collection sensitiveWords, boolean isAsync){
      if(isAsync){
        // 异步初始化敏感词树
        ThreadUtil.execAsync(new Callable(){
          @Override
          public Boolean call() throws Exception {
            init(sensitiveWords);
            return true;
          }
          
        });
      }else{
        // 同步初始化敏感词树
        init(sensitiveWords);
      }
    }
    

    相关地址


    __EOF__

  • 本文作者: JavaGuide
  • 本文链接: https://www.cnblogs.com/javaguide/p/17292904.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    leetcode 刷题 log day 45
    pdf文件转txt怎么转?这几个方法你值得收藏
    Linux网络协议.之 tcp,udp,socket网络编程(四).之网络转换函数htonl,ntohs等介绍
    【Effective Objective - C】—— block 块
    [Pandas技巧] 分组比例计算求和
    ChatGPT高级数据分析功能
    06.数据解析-xpath
    Typescript 回调函数、事件侦听的类型定义与注释--拾人牙慧
    Python 接口测试框架
    企业如何防范邮件数据泄露的风险?(含直播预告)
  • 原文地址:https://www.cnblogs.com/javaguide/p/17292904.html