全網最詳細Hutool工具詳解

很多方法請看官網地址:hutool官網地址

WalkonNet下載:https://www.jb51.net/softs/549331.html

簡介

Hutool是一個小而全的Java工具類庫,通過靜態方法封裝,降低相關API的學習成本,提高工作效率,使Java擁有函數式語言般的優雅,讓Java語言也可以“甜甜的”。

Hutool中的工具方法來自每個用戶的精雕細琢,它涵蓋瞭Java開發底層代碼中的方方面面,它既是大型項目開發中解決小問題的利器,也是小型項目中的效率擔當;

Hutool是項目中“util”包友好的替代,它節省瞭開發人員對項目中公用類和公用工具方法的封裝時間,使開發專註於業務,同時可以最大限度的避免封裝不完善帶來的bug。

Hutool名稱的由來
Hutool = Hu + tool,是原公司項目底層代碼剝離後的開源庫,“Hu”是公司名稱的表示,tool表示工具。Hutool諧音“糊塗”,一方面簡潔易懂,一方面寓意“難得糊塗”。

Hutool如何改變我們的coding方式
Hutool的目標是使用一個工具方法代替一段復雜代碼,從而最大限度的避免“復制粘貼”代碼的問題,徹底改變我們寫代碼的方式。

以計算MD5為例:

【以前】打開搜索引擎 -> 搜“Java MD5加密” -> 打開某篇博客-> 復制粘貼 -> 改改好用
【現在】引入Hutool -> SecureUtil.md5()
Hutool的存在就是為瞭減少代碼搜索成本,避免網絡上參差不齊的代碼出現導致的bug。

包含組件

一個Java基礎工具類,對文件、流、加密解密、轉碼、正則、線程、XML等JDK方法進行封裝,組成各種Util工具類,同時提供以下組件:

模塊 介紹
hutool-aop JDK動態代理封裝,提供非IOC下的切面支持
hutool-bloomFilter 佈隆過濾,提供一些Hash算法的佈隆過濾
hutool-cache 簡單緩存實現
hutool-core 核心,包括Bean操作、日期、各種Util等
hutool-cron 定時任務模塊,提供類Crontab表達式的定時任務
hutool-crypto 加密解密模塊,提供對稱、非對稱和摘要算法封裝
hutool-db JDBC封裝後的數據操作,基於ActiveRecord思想
hutool-dfa 基於DFA模型的多關鍵字查找
hutool-extra 擴展模塊,對第三方封裝(模板引擎、郵件、Servlet、二維碼、Emoji、FTP、分詞等)
hutool-http 基於HttpUrlConnection的Http客戶端封裝
hutool-log 自動識別日志實現的日志門面
hutool-script 腳本執行封裝,例如Javascript
hutool-setting 功能更強大的Setting配置文件和Properties封裝
hutool-system 系統參數調用封裝(JVM信息等)
hutool-json JSON實現
hutool-captcha 圖片驗證碼實現
hutool-poi 針對POI中Excel和Word的封裝
hutool-socket 基於Java的NIO和AIO的Socket封裝

Maven
在項目的pom.xml的dependencies中加入以下內容:

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

痛點

在Java開發中我們要面對各種各樣的類型轉換問題,尤其是從命令行獲取的用戶參數、從HttpRequest獲取的Parameter等等,這些參數類型多種多樣,我們怎麼去轉換他們呢?常用的辦法是先整成String,然後調用XXX.parseXXX方法,還要承受轉換失敗的風險,不得不加一層try catch,這個小小的過程混跡在業務代碼中會顯得非常難看和臃腫。

Convert類

Convert類可以說是一個工具方法類,裡面封裝瞭針對Java常見類型的轉換,用於簡化類型轉換。Convert類中大部分方法為toXXX,參數為Object,可以實現將任意可能的類型轉換為指定類型。同時支持第二個參數defaultValue用於在轉換失敗時返回一個默認值。

Java常見類型轉換

1.轉換為字符串:

int a = 1;
//aStr為"1"
String aStr = Convert.toStr(a);

long[] b = {1,2,3,4,5};
//bStr為:"[1, 2, 3, 4, 5]"
String bStr = Convert.toStr(b);

2.轉換為指定類型數組:

String[] b = { "1", "2", "3", "4" };
//結果為Integer數組
Integer[] intArray = Convert.toIntArray(b);

long[] c = {1,2,3,4,5};
//結果為Integer數組
Integer[] intArray2 = Convert.toIntArray(c);

3.轉換為日期對象:

String a = "2017-05-06";
Date value = Convert.toDate(a);

4.轉換為集合

Object[] a = {"a", "你", "好", "", 1};
List<?> list = Convert.convert(List.class, a);
//從4.1.11開始可以這麼用
List<?> list = Convert.toList(a);

其它類型轉換

1.標準類型
通過Convert.convert(Class, Object)方法可以將任意類型轉換為指定類型,Hutool中預定義瞭許多類型轉換,例如轉換為URI、URL、Calendar等等,這些類型的轉換都依托於ConverterRegistry類。通過這個類和Converter接口,我們可以自定義一些類型轉換。詳細的使用請參閱“自定義類型轉換”一節。

2.泛型類型
通過convert(TypeReference reference, Object value)方法,自行new一個TypeReference對象可以對嵌套泛型進行類型轉換。例如,我們想轉換一個對象為List類型,此時傳入的標準Class就無法滿足要求,此時我們可以這樣:

Object[] a = { "a", "你", "好", "", 1 };
List<String> list = Convert.convert(new TypeReference<List<String>>() {}, a);

通過TypeReference實例化後制定泛型類型,即可轉換對象為我們想要的目標類型。

16進制(Hex)

在很多加密解密,以及中文字符串傳輸(比如表單提交)的時候,會用到16進制轉換,就是Hex轉換,為此Hutool中專門封裝瞭HexUtil工具類,考慮到16進制轉換也是轉換的一部分,因此將其方法也放在Convert類中,便於理解和查找,使用同樣非常簡單:

轉為16進制(Hex)字符串

String a = "我是一個小小的可愛的字符串";

//結果:"e68891e698afe4b880e4b8aae5b08fe5b08fe79a84e58fafe788b1e79a84e5ad97e7aca6e4b8b2"
String hex = Convert.toHex(a, CharsetUtil.CHARSET_UTF_8);

將16進制(Hex)字符串轉為普通字符串:

String hex = "e68891e698afe4b880e4b8aae5b08fe5b08fe79a84e58fafe788b1e79a84e5ad97e7aca6e4b8b2";

//結果為:"我是一個小小的可愛的字符串"
String raw = Convert.hexStrToStr(hex, CharsetUtil.CHARSET_UTF_8);

//註意:在4.1.11之後hexStrToStr將改名為hexToStr
String raw = Convert.hexToStr(hex, CharsetUtil.CHARSET_UTF_8);

因為字符串牽涉到編碼問題,因此必須傳入編碼對象,此處使用UTF-8編碼。 toHex方法同樣支持傳入byte[],同樣也可以使用hexToBytes方法將16進制轉為byte[]

Unicode和字符串轉換

與16進制類似,Convert類同樣可以在字符串和Unicode之間輕松轉換:

String a = "我是一個小小的可愛的字符串";

//結果為:"\\u6211\\u662f\\u4e00\\u4e2a\\u5c0f\\u5c0f\\u7684\\u53ef\\u7231\\u7684\\u5b57\\u7b26\\u4e32"    
String unicode = Convert.strToUnicode(a);

//結果為:"我是一個小小的可愛的字符串"
String raw = Convert.unicodeToStr(unicode);

編碼轉換

在接收表單的時候,我們常常被中文亂碼所困擾,其實大多數原因是使用瞭不正確的編碼方式解碼瞭數據。於是Convert.convertCharset方法便派上用場瞭,它可以把亂碼轉為正確的編碼方式:

String a = "我不是亂碼";
//轉換後result為亂碼
String result = Convert.convertCharset(a, CharsetUtil.UTF_8, CharsetUtil.ISO_8859_1);
String raw = Convert.convertCharset(result, CharsetUtil.ISO_8859_1, "UTF-8");
Assert.assertEquals(raw, a);

註意 經過測試,UTF-8編碼後用GBK解碼再用GBK編碼後用UTF-8解碼會存在某些中文轉換失敗的問題。

時間單位轉換

Convert.convertTime方法主要用於轉換時長單位,比如一個很大的毫秒,我想獲得這個毫秒數對應多少分:

long a = 4535345;

//結果為:75
long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);

金額大小寫轉換

面對財務類需求,Convert.digitToChinese將金錢數轉換為大寫形式:

double a = 67556.32;

//結果為:"陸萬柒仟伍佰伍拾陸元叁角貳分"
String digitUppercase = Convert.digitToChinese(a);

註意 轉換為大寫隻能精確到分(小數點兒後兩位),之後的數字會被忽略。

原始類和包裝類轉換

有的時候,我們需要將包裝類和原始類相互轉換(比如Integer.class 和 int.class),這時候我們可以:

//去包裝
Class<?> wrapClass = Integer.class;

//結果為:int.class
Class<?> unWraped = Convert.unWrap(wrapClass);

//包裝
Class<?> primitiveClass = long.class;

//結果為:Long.class
Class<?> wraped = Convert.wrap(primitiveClass);

格式化為字符串

調用toString()方法即可返回格式為yyyy-MM-dd HH:mm:ss的字符串,調用toString(String format)可以返回指定格式的字符串。

DateTime dateTime = new DateTime("2017-01-05 12:34:23", DatePattern.NORM_DATETIME_FORMAT);
//結果:2017-01-05 12:34:23
String dateStr = dateTime.toString();

//結果:2017/01/05

LocalDateTime工具-LocalDateTimeUtil

使用

日期轉換

String dateStr = "2020-01-23T12:23:56";
DateTime dt = DateUtil.parse(dateStr);

// Date對象轉換為LocalDateTime
LocalDateTime of = LocalDateTimeUtil.of(dt);

// 時間戳轉換為LocalDateTime
of = LocalDateTimeUtil.ofUTC(dt.getTime());

日期字符串解析

// 解析ISO時間
LocalDateTime localDateTime = LocalDateTimeUtil.parse("2020-01-23T12:23:56");


// 解析自定義格式時間
localDateTime = LocalDateTimeUtil.parse("2020-01-23", DatePattern.NORM_DATE_PATTERN);

解析同樣支持LocalDate:

LocalDate localDate = LocalDateTimeUtil.parseDate("2020-01-23");

// 解析日期時間為LocalDate,時間部分舍棄
localDate = LocalDateTimeUtil.parseDate("2020-01-23T12:23:56", DateTimeFormatter.ISO_DATE_TIME);

日期格式化

LocalDateTime localDateTime = LocalDateTimeUtil.parse("2020-01-23T12:23:56");

// "2020-01-23 12:23:56"
String format = LocalDateTimeUtil.format(localDateTime, DatePattern.NORM_DATETIME_PATTERN);

日期偏移

final LocalDateTime localDateTime = LocalDateTimeUtil.parse("2020-01-23T12:23:56");

// 增加一天
// "2020-01-24T12:23:56"
LocalDateTime offset = LocalDateTimeUtil.offset(localDateTime, 1, ChronoUnit.DAYS);

如果是減少時間,offset第二個參數傳負數即可:

// "2020-01-22T12:23:56"
offset = LocalDateTimeUtil.offset(localDateTime, -1, ChronoUnit.DAYS);

日期偏移

LocalDateTime start = LocalDateTimeUtil.parse("2019-02-02T00:00:00");
LocalDateTime end = LocalDateTimeUtil.parse("2020-02-02T00:00:00");

Duration between = LocalDateTimeUtil.between(start, end);

// 365
between.toDays();

一天的開始和結束

LocalDateTime localDateTime = LocalDateTimeUtil.parse("2020-01-23T12:23:56");

// "2020-01-23T00:00"
LocalDateTime beginOfDay = LocalDateTimeUtil.beginOfDay(localDateTime);

// "2020-01-23T23:59:59.999999999"
LocalDateTime endOfDay = LocalDateTimeUtil.endOfDay(localDateTime);

字符串工具-StrUtil

1.removePrefix、removeSuffix方法
這兩個是去掉字符串的前綴後綴的,例如去個文件名的擴展名啥。

String fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg")  //fileName -> pretty_girl

還有忽略大小寫的removePrefixIgnoreCase和removeSuffixIgnoreCase都比較實用。
2. sub方法
不得不提一下這個方法,有人說String有瞭subString你還寫它幹啥,我想說subString方法越界啥的都會報異常,你還得自己判斷,難受死瞭,我把各種情況判斷都加進來瞭,而且index的位置還支持負數哦,-1表示最後一個字符(這個思想來自於Python,如果學過Python的應該會很喜歡的),還有就是如果不小心把第一個位置和第二個位置搞反瞭,也會自動修正(例如想截取第4個和第2個字符之間的部分也是可以的哦~) 舉個栗子

String str = "abcdefgh";
String strSub1 = StrUtil.sub(str, 2, 3); //strSub1 -> c
String strSub2 = StrUtil.sub(str, 2, -3); //strSub2 -> cde
String strSub3 = StrUtil.sub(str, 3, 2); //strSub2 -> c

3.format方法

String template = "{}愛{},就像老鼠愛大米";
String str = StrUtil.format(template, "我", "你"); //str -> 我愛你,就像老鼠愛大米

參數我定義成瞭Object類型,如果傳別的類型的也可以,會自動調用toString()方法的。

Digester

以MD5為例:

Digester md5 = new Digester(DigestAlgorithm.MD5);

// 5393554e94bf0eb6436f240a4fd71282
String digestHex = md5.digestHex(testStr);

當然,做為最為常用的方法,MD5等方法被封裝為工具方法在DigestUtil中,以上代碼可以進一步簡化為:

// 5393554e94bf0eb6436f240a4fd71282
String md5Hex1 = DigestUtil.md5Hex(testStr);

Hutool-http

最簡單的使用莫過於用HttpUtil工具類快速請求某個頁面:

//GET請求
String content = HttpUtil.get(url);

一行代碼即可搞定,當然Post請求也很簡單:

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

String result1 = HttpUtil.post(url, paramMap);

Post請求隻需使用Map預先制定form表單項即可。

到此這篇關於全文最詳細Hutool工具詳解的文章就介紹到這瞭,更多相關Hutool工具內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: