全網最詳細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!
推薦閱讀:
- Java 8 Time Api 使用方法技巧
- hutool 工具類基本使用教程
- 詳解Java關於JDK中時間日期的API
- java中的DateTime的具體使用
- Java8的DateTimeFormatter與SimpleDateFormat的區別詳解