<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          干掉復(fù)雜的工具類,Hutool 工具庫確實(shí)香??!

          共 9489字,需瀏覽 19分鐘

           ·

          2023-07-27 08:59

          Hutool 大家已經(jīng)比較熟悉了,這是一個(gè)超全的 Java 工具庫,深受國內(nèi)開發(fā)者的喜愛。

          我之前其實(shí)是不太喜歡使用這種功能太多的工具類的,也比較擔(dān)心穩(wěn)定性和安全性,后面慢慢接受了就感覺其實(shí)也還好。而且,我們還可以按需只引入自己需要的功能模塊,相對(duì)也比較靈活。

          Hutool 的官方文檔介紹的已經(jīng)比較清晰了,奈何其提供的功能實(shí)在太多,我這里列舉一些我個(gè)人覺得比較實(shí)用的功能,供大家學(xué)習(xí)參考。

          Hutool 介紹

          Hutool 真心是一個(gè)不錯(cuò)的國產(chǎn) Java 工具類庫,功能全面,對(duì)文件、流、加密解密、轉(zhuǎn)碼、正則、線程、XML 等 JDK 方法進(jìn)行了封裝,開箱即用!

          官方是這樣介紹 Hutool 的:

          Hutool 介紹

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

          Hutool 包含的組件

          你可以根據(jù)項(xiàng)目需求對(duì)每個(gè)模塊單獨(dú)引入,也可以通過引入hutool-all方式引入所有模塊。不過,還是不建議引入所有模塊,因?yàn)榻^大部分功能項(xiàng)目可能都用不上,建議只引入你需要的模塊。

          另外,Hutool 也有一個(gè)比較明顯的缺點(diǎn),很多功能實(shí)現(xiàn)的比較簡單比如圖片驗(yàn)證碼、Excel 工具類,很可能無法滿足項(xiàng)目的實(shí)際需求。像這樣情況,還是建議你選擇在某一方面更優(yōu)秀的工具庫比如 Excel 工具庫 MyExcel、EasyExcel、圖片處理庫 Imglib。

          Hutool 實(shí)戰(zhàn)

          引入依賴

          Maven 倉庫地址:https://mvnrepository.com/artifact/cn.hutool

          這里為了方便,我們直接引入所有模塊,實(shí)際項(xiàng)目中還是建議只引入自己需要的模塊。

          Maven:

          <dependency>
              <groupId>cn.hutool</groupId>
              <artifactId>hutool-all</artifactId>
              <version>5.8.16</version>
          </dependency>

          Gradle:

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

          功能演示

          Hutool 提供的功能實(shí)在太多,這里只列舉一些我個(gè)人覺得比較實(shí)用的功能,供大家學(xué)習(xí)參考。

          類型轉(zhuǎn)換

          Convert 類封裝了針對(duì) Java 常見類型的轉(zhuǎn)換。

          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 中發(fā)送郵件主要品依靠 javax.mail 包,但是由于使用比較繁瑣,因此 Hutool 針對(duì)其做了封裝。

          在 classpath(在標(biāo)準(zhǔn) Maven 項(xiàng)目中為src/main/resources)的 config 目錄下新建mail.setting文件,完整配置如下(郵件服務(wù)器必須支持并打開 SMTP 協(xié)議):

          # 郵件服務(wù)器的SMTP地址,可選,默認(rèn)為smtp.<發(fā)件人郵箱后綴>
          host = smtp.yeah.net
          # 郵件服務(wù)器的SMTP端口,可選,默認(rèn)25
          port = 25
          # 發(fā)件人(必須正確,否則發(fā)送失?。?br>from = [email protected]
          # 用戶名,默認(rèn)為發(fā)件人郵箱前綴
          user = hutool
          # 密碼(注意,某些郵箱需要為SMTP服務(wù)單獨(dú)設(shè)置授權(quán)碼,詳情查看相關(guān)幫助)
          pass = q1w2e3

          發(fā)送郵件非常簡單:

          MailUtil.send("[email protected]""測(cè)試""郵件來自Hutool測(cè)試"false);

          支持群發(fā):

          ArrayList<String> tos = CollUtil.newArrayList(
              "[email protected]",
              "[email protected]",
              "[email protected]",
              "[email protected]");

          MailUtil.send(tos, "測(cè)試""郵件來自Hutool群發(fā)測(cè)試"false);

          支持添加一個(gè)或者多個(gè)附件:

          MailUtil.send("[email protected]""測(cè)試""<h1>郵件來自Hutool測(cè)試</h1>"true, FileUtil.file("d:/aaa.xml"));

          除了使用配置文件定義全局賬號(hào)以外,MailUtil.send方法同時(shí)提供重載方法可以傳入一個(gè)MailAccount對(duì)象,這個(gè)對(duì)象為一個(gè)普通 Bean,記錄了郵件服務(wù)器信息。

          MailAccount account = new MailAccount();
          account.setHost("smtp.yeah.net");
          account.setPort("25");
          account.setAuth(true);
          account.setFrom("[email protected]");
          account.setUser("hutool");
          account.setPass("q1w2e3");

          MailUtil.send(account, CollUtil.newArrayList("[email protected]"), "測(cè)試""郵件來自Hutool測(cè)試"false);

          唯一 ID

          在分布式環(huán)境中,唯一 ID 生成應(yīng)用十分廣泛,生成方法也多種多樣,Hutool 針對(duì)一些常用生成策略做了簡單封裝。

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

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

          拿 UUID 舉例!

          Hutool 重寫java.util.UUID的邏輯,對(duì)應(yīng)類為cn.hutool.core.lang.UUID,使生成不帶-的 UUID 字符串不再需要做字符替換,性能提升一倍左右。

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

          //生成的是不帶-的字符串,類似于:b17f24ff026d40949c85a24f4f375d42
          String simpleUUID = IdUtil.simpleUUID();

          HTTP 請(qǐng)求工具類

          針對(duì)最為常用的 GET 和 POST 請(qǐng)求,HttpUtil 封裝了兩個(gè)方法,

          • HttpUtil.get
          • HttpUtil.post

          GET 請(qǐng)求:

          // 最簡單的HTTP請(qǐng)求,可以自動(dòng)通過header等信息判斷編碼,不區(qū)分HTTP和HTTPS
          String result1= HttpUtil.get("https://www.baidu.com");

          // 當(dāng)無法識(shí)別頁面編碼的時(shí)候,可以自定義請(qǐng)求頁面的編碼
          String result2= HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);

          //可以單獨(dú)傳入http參數(shù),這樣參數(shù)會(huì)自動(dòng)做URL編碼,拼接在URL中
          HashMap<String, Object> paramMap = new HashMap<>();
          paramMap.put("city""北京");

          String result3= HttpUtil.get("https://www.baidu.com", paramMap);

          POST 請(qǐng)求:

          HashMap<String, Object> paramMap = new HashMap<>();
          paramMap.put("city""北京");

          String result= HttpUtil.post("https://www.baidu.com", paramMap);

          文件上傳:

          HashMap<String, Object> paramMap = new HashMap<>();
          //文件上傳只需將參數(shù)中的鍵指定(默認(rèn)file),值設(shè)為文件對(duì)象即可,對(duì)于使用者來說,文件上傳與普通表單提交并無區(qū)別
          paramMap.put("file", FileUtil.file("D:\\face.jpg"));

          String result= HttpUtil.post("https://www.baidu.com", paramMap);

          緩存

          Hutool 提供了常見的幾種緩存策略的實(shí)現(xiàn):

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

          并且,Hutool 還支持將小文件以 byte[] 的形式緩存到內(nèi)容中,減少文件的訪問,以解決頻繁讀取文件引起的性能問題。

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

          Cache<String,String> fifoCache = CacheUtil.newFIFOCache(3);

          //加入元素,每個(gè)元素可以設(shè)置其過期時(shí)長,DateUnit.SECOND.getMillis()代表每秒對(duì)應(yīng)的毫秒數(shù),在此為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,當(dāng)加入第四個(gè)元素的時(shí)候,根據(jù)FIFO規(guī)則,最先放入的對(duì)象將被移除
          fifoCache.put("key4""value4", DateUnit.SECOND.getMillis() * 3);

          //value1為null
          String value1 = fifoCache.get("key1");

          控制臺(tái)打印封裝

          一般情況下,我們打印信息到控制臺(tái)小伙伴們應(yīng)該再熟悉不過了!

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

          但是,這種方式不滿足很多場(chǎng)景的需要:

          1. 不支持參數(shù),對(duì)象打印需要拼接字符串
          2. 不能直接打印數(shù)組,需要手動(dòng)調(diào)用Arrays.toString

          為此,Hutool 封裝了Console對(duì)象。

          Console對(duì)象的使用更加類似于 Javascript 的console.log()方法,這也是借鑒了 JS 的一個(gè)語法糖。

          String[] a = {"java""c++""c"};
          Console.log(a);//控制臺(tái)輸出:[java, c++, c]

          Console.log("This is Console log for {}.""test");//控制臺(tái)輸出:This is Console log for test.

          加密解密

          Hutool 支持對(duì)稱加密、非對(duì)稱加密、摘要加密、消息認(rèn)證碼算法、國密。

          這里以國密為例,Hutool 針對(duì)Bouncy Castle做了簡化包裝,用于實(shí)現(xiàn)國密算法中的 SM2、SM3、SM4。

          國密算法需要引入Bouncy Castle庫的依賴:

          <dependency>
              <groupId>org.bouncycastle</groupId>
              <artifactId>bcprov-jdk15to18</artifactId>
              <version>1.69</version>
          </dependency>

          SM2 使用自定義密鑰對(duì)加密或解密

          String text = "JavaGuide:一份涵蓋大部分 Java 程序員所需要掌握的核心知識(shí)。準(zhǔn)備 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 簽名和驗(yàn)簽

          //加簽
          String sign = sm2.signHex(HexUtil.encodeHexStr(text));
          System.out.println("簽名:" + sign);
          //驗(yàn)簽
          boolean verify = sm2.verifyHex(HexUtil.encodeHexStr(text), sign);
          System.out.println("驗(yàn)簽:" + verify);

          輸出結(jié)果:

          線程池

          Hutool 支持使用建造者的模式創(chuàng)建自定義線程池,這樣看著更加清晰。

          private static ExecutorService pool = ExecutorBuilder.create()
                        .setCorePoolSize(10)//初始池大小
                        .setMaxPoolSize(20//最大池大小
                        .setWorkQueue(new LinkedBlockingQueue<>(100))//最大等待數(shù)為100
                        .setThreadFactory(ThreadFactoryBuilder.create().setNamePrefix("IM-Pool-").build())// 線程池命名
                        .build();

          實(shí)際項(xiàng)目中,如果一個(gè)對(duì)象的屬性比較多,有限考慮使用建造者模式創(chuàng)建對(duì)象。

          并且,Hutool 還提供一個(gè)全局的線程池,默認(rèn)所有異步方法在這個(gè)線程池中執(zhí)行。

          • ThreadUtil.execute : 直接在公共線程池中執(zhí)行線程
          • ThreadUtil.execAsync: 執(zhí)行異步方法
          • ......

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

          public static void init(final Collection<String> sensitiveWords, boolean isAsync){
            if(isAsync){
              // 異步初始化敏感詞樹
              ThreadUtil.execAsync(new Callable<Boolean>(){
                @Override
                public Boolean call() throws Exception {
                  init(sensitiveWords);
                  return true;
                }

              });
            }else{
              // 同步初始化敏感詞樹
              init(sensitiveWords);
            }
          }

          相關(guān)地址

          • 項(xiàng)目地址:https://github.com/dromara/hutool
          • 官網(wǎng):https://hutool.cn/

          ··············  END  ··············

          瀏覽 35
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天日天天操心 | 国产一区在线观看视频 | 婷婷丁香激情五月天 | 日韩无码三级视频 | 国产精品九九九九。。。 |