全網(wǎng)最詳細(xì)Hutool工具詳解
很多方法請看官網(wǎng)地址:hutool官網(wǎng)地址
腳本之家下載:http://www.dbjr.com.cn/softs/549331.html
簡介
Hutool是一個小而全的Java工具類庫,通過靜態(tài)方法封裝,降低相關(guān)API的學(xué)習(xí)成本,提高工作效率,使Java擁有函數(shù)式語言般的優(yōu)雅,讓Java語言也可以“甜甜的”。
Hutool中的工具方法來自每個用戶的精雕細(xì)琢,它涵蓋了Java開發(fā)底層代碼中的方方面面,它既是大型項(xiàng)目開發(fā)中解決小問題的利器,也是小型項(xiàng)目中的效率擔(dān)當(dāng);
Hutool是項(xiàng)目中“util”包友好的替代,它節(jié)省了開發(fā)人員對項(xiàng)目中公用類和公用工具方法的封裝時間,使開發(fā)專注于業(yè)務(wù),同時可以最大限度的避免封裝不完善帶來的bug。
Hutool名稱的由來
Hutool = Hu + tool,是原公司項(xiàng)目底層代碼剝離后的開源庫,“Hu”是公司名稱的表示,tool表示工具。Hutool諧音“糊涂”,一方面簡潔易懂,一方面寓意“難得糊涂”。
Hutool如何改變我們的coding方式
Hutool的目標(biāo)是使用一個工具方法代替一段復(fù)雜代碼,從而最大限度的避免“復(fù)制粘貼”代碼的問題,徹底改變我們寫代碼的方式。
以計(jì)算MD5為例:
【以前】打開搜索引擎 -> 搜“Java MD5加密” -> 打開某篇博客-> 復(fù)制粘貼 -> 改改好用
【現(xiàn)在】引入Hutool -> SecureUtil.md5()
Hutool的存在就是為了減少代碼搜索成本,避免網(wǎng)絡(luò)上參差不齊的代碼出現(xiàn)導(dǎo)致的bug。
包含組件
一個Java基礎(chǔ)工具類,對文件、流、加密解密、轉(zhuǎn)碼、正則、線程、XML等JDK方法進(jìn)行封裝,組成各種Util工具類,同時提供以下組件:
模塊 | 介紹 |
---|---|
hutool-aop | JDK動態(tài)代理封裝,提供非IOC下的切面支持 |
hutool-bloomFilter | 布隆過濾,提供一些Hash算法的布隆過濾 |
hutool-cache | 簡單緩存實(shí)現(xiàn) |
hutool-core | 核心,包括Bean操作、日期、各種Util等 |
hutool-cron | 定時任務(wù)模塊,提供類Crontab表達(dá)式的定時任務(wù) |
hutool-crypto | 加密解密模塊,提供對稱、非對稱和摘要算法封裝 |
hutool-db | JDBC封裝后的數(shù)據(jù)操作,基于ActiveRecord思想 |
hutool-dfa | 基于DFA模型的多關(guān)鍵字查找 |
hutool-extra | 擴(kuò)展模塊,對第三方封裝(模板引擎、郵件、Servlet、二維碼、Emoji、FTP、分詞等) |
hutool-http | 基于HttpUrlConnection的Http客戶端封裝 |
hutool-log | 自動識別日志實(shí)現(xiàn)的日志門面 |
hutool-script | 腳本執(zhí)行封裝,例如Javascript |
hutool-setting | 功能更強(qiáng)大的Setting配置文件和Properties封裝 |
hutool-system | 系統(tǒng)參數(shù)調(diào)用封裝(JVM信息等) |
hutool-json | JSON實(shí)現(xiàn) |
hutool-captcha | 圖片驗(yàn)證碼實(shí)現(xiàn) |
hutool-poi | 針對POI中Excel和Word的封裝 |
hutool-socket | 基于Java的NIO和AIO的Socket封裝 |
Maven
在項(xiàng)目的pom.xml的dependencies中加入以下內(nèi)容:
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.5.2</version> </dependency>
痛點(diǎn)
在Java開發(fā)中我們要面對各種各樣的類型轉(zhuǎn)換問題,尤其是從命令行獲取的用戶參數(shù)、從HttpRequest獲取的Parameter等等,這些參數(shù)類型多種多樣,我們怎么去轉(zhuǎn)換他們呢?常用的辦法是先整成String,然后調(diào)用XXX.parseXXX方法,還要承受轉(zhuǎn)換失敗的風(fēng)險,不得不加一層try catch,這個小小的過程混跡在業(yè)務(wù)代碼中會顯得非常難看和臃腫。
Convert類
Convert類可以說是一個工具方法類,里面封裝了針對Java常見類型的轉(zhuǎn)換,用于簡化類型轉(zhuǎn)換。Convert類中大部分方法為toXXX,參數(shù)為Object,可以實(shí)現(xiàn)將任意可能的類型轉(zhuǎn)換為指定類型。同時支持第二個參數(shù)defaultValue用于在轉(zhuǎn)換失敗時返回一個默認(rèn)值。
Java常見類型轉(zhuǎn)換
1.轉(zhuǎn)換為字符串:
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.轉(zhuǎn)換為指定類型數(shù)組:
String[] b = { "1", "2", "3", "4" }; //結(jié)果為Integer數(shù)組 Integer[] intArray = Convert.toIntArray(b); long[] c = {1,2,3,4,5}; //結(jié)果為Integer數(shù)組 Integer[] intArray2 = Convert.toIntArray(c);
3.轉(zhuǎn)換為日期對象:
String a = "2017-05-06"; Date value = Convert.toDate(a);
4.轉(zhuǎn)換為集合
Object[] a = {"a", "你", "好", "", 1}; List<?> list = Convert.convert(List.class, a); //從4.1.11開始可以這么用 List<?> list = Convert.toList(a);
其它類型轉(zhuǎn)換
1.標(biāo)準(zhǔn)類型
通過Convert.convert(Class, Object)方法可以將任意類型轉(zhuǎn)換為指定類型,Hutool中預(yù)定義了許多類型轉(zhuǎn)換,例如轉(zhuǎn)換為URI、URL、Calendar等等,這些類型的轉(zhuǎn)換都依托于ConverterRegistry類。通過這個類和Converter接口,我們可以自定義一些類型轉(zhuǎn)換。詳細(xì)的使用請參閱“自定義類型轉(zhuǎn)換”一節(jié)。
2.泛型類型
通過convert(TypeReference reference, Object value)方法,自行new一個TypeReference對象可以對嵌套泛型進(jìn)行類型轉(zhuǎn)換。例如,我們想轉(zhuǎn)換一個對象為List類型,此時傳入的標(biāo)準(zhǔn)Class就無法滿足要求,此時我們可以這樣:
Object[] a = { "a", "你", "好", "", 1 }; List<String> list = Convert.convert(new TypeReference<List<String>>() {}, a);
通過TypeReference實(shí)例化后制定泛型類型,即可轉(zhuǎn)換對象為我們想要的目標(biāo)類型。
16進(jìn)制(Hex)
在很多加密解密,以及中文字符串傳輸(比如表單提交)的時候,會用到16進(jìn)制轉(zhuǎn)換,就是Hex轉(zhuǎn)換,為此Hutool中專門封裝了HexUtil工具類,考慮到16進(jìn)制轉(zhuǎn)換也是轉(zhuǎn)換的一部分,因此將其方法也放在Convert類中,便于理解和查找,使用同樣非常簡單:
轉(zhuǎn)為16進(jìn)制(Hex)字符串
String a = "我是一個小小的可愛的字符串"; //結(jié)果:"e68891e698afe4b880e4b8aae5b08fe5b08fe79a84e58fafe788b1e79a84e5ad97e7aca6e4b8b2" String hex = Convert.toHex(a, CharsetUtil.CHARSET_UTF_8);
將16進(jìn)制(Hex)字符串轉(zhuǎn)為普通字符串:
String hex = "e68891e698afe4b880e4b8aae5b08fe5b08fe79a84e58fafe788b1e79a84e5ad97e7aca6e4b8b2"; //結(jié)果為:"我是一個小小的可愛的字符串" String raw = Convert.hexStrToStr(hex, CharsetUtil.CHARSET_UTF_8); //注意:在4.1.11之后hexStrToStr將改名為hexToStr String raw = Convert.hexToStr(hex, CharsetUtil.CHARSET_UTF_8);
因?yàn)樽址疇可娴骄幋a問題,因此必須傳入編碼對象,此處使用UTF-8編碼。 toHex方法同樣支持傳入byte[],同樣也可以使用hexToBytes方法將16進(jìn)制轉(zhuǎn)為byte[]
Unicode和字符串轉(zhuǎn)換
與16進(jìn)制類似,Convert類同樣可以在字符串和Unicode之間輕松轉(zhuǎn)換:
String a = "我是一個小小的可愛的字符串"; //結(jié)果為:"\\u6211\\u662f\\u4e00\\u4e2a\\u5c0f\\u5c0f\\u7684\\u53ef\\u7231\\u7684\\u5b57\\u7b26\\u4e32" String unicode = Convert.strToUnicode(a); //結(jié)果為:"我是一個小小的可愛的字符串" String raw = Convert.unicodeToStr(unicode);
編碼轉(zhuǎn)換
在接收表單的時候,我們常常被中文亂碼所困擾,其實(shí)大多數(shù)原因是使用了不正確的編碼方式解碼了數(shù)據(jù)。于是Convert.convertCharset方法便派上用場了,它可以把亂碼轉(zhuǎn)為正確的編碼方式:
String a = "我不是亂碼"; //轉(zhuǎn)換后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);
注意 經(jīng)過測試,UTF-8編碼后用GBK解碼再用GBK編碼后用UTF-8解碼會存在某些中文轉(zhuǎn)換失敗的問題。
時間單位轉(zhuǎn)換
Convert.convertTime方法主要用于轉(zhuǎn)換時長單位,比如一個很大的毫秒,我想獲得這個毫秒數(shù)對應(yīng)多少分:
long a = 4535345; //結(jié)果為:75 long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);
金額大小寫轉(zhuǎn)換
面對財務(wù)類需求,Convert.digitToChinese將金錢數(shù)轉(zhuǎn)換為大寫形式:
double a = 67556.32; //結(jié)果為:"陸萬柒仟伍佰伍拾陸元叁角貳分" String digitUppercase = Convert.digitToChinese(a);
注意 轉(zhuǎn)換為大寫只能精確到分(小數(shù)點(diǎn)兒后兩位),之后的數(shù)字會被忽略。
原始類和包裝類轉(zhuǎn)換
有的時候,我們需要將包裝類和原始類相互轉(zhuǎn)換(比如Integer.class 和 int.class),這時候我們可以:
//去包裝 Class<?> wrapClass = Integer.class; //結(jié)果為:int.class Class<?> unWraped = Convert.unWrap(wrapClass); //包裝 Class<?> primitiveClass = long.class; //結(jié)果為:Long.class Class<?> wraped = Convert.wrap(primitiveClass);
格式化為字符串
調(diào)用toString()方法即可返回格式為yyyy-MM-dd HH:mm:ss的字符串,調(diào)用toString(String format)可以返回指定格式的字符串。
DateTime dateTime = new DateTime("2017-01-05 12:34:23", DatePattern.NORM_DATETIME_FORMAT); //結(jié)果:2017-01-05 12:34:23 String dateStr = dateTime.toString(); //結(jié)果:2017/01/05
LocalDateTime工具-LocalDateTimeUtil
使用
日期轉(zhuǎn)換
String dateStr = "2020-01-23T12:23:56"; DateTime dt = DateUtil.parse(dateStr); // Date對象轉(zhuǎn)換為LocalDateTime LocalDateTime of = LocalDateTimeUtil.of(dt); // 時間戳轉(zhuǎn)換為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第二個參數(shù)傳負(fù)數(shù)即可:
// "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();
一天的開始和結(jié)束
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方法
這兩個是去掉字符串的前綴后綴的,例如去個文件名的擴(kuò)展名啥。
String fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg") //fileName -> pretty_girl
還有忽略大小寫的removePrefixIgnoreCase和removeSuffixIgnoreCase都比較實(shí)用。
2. sub方法
不得不提一下這個方法,有人說String有了subString你還寫它干啥,我想說subString方法越界啥的都會報異常,你還得自己判斷,難受死了,我把各種情況判斷都加進(jìn)來了,而且index的位置還支持負(fù)數(shù)哦,-1表示最后一個字符(這個思想來自于Python,如果學(xué)過Python的應(yīng)該會很喜歡的),還有就是如果不小心把第一個位置和第二個位置搞反了,也會自動修正(例如想截取第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 -> 我愛你,就像老鼠愛大米
參數(shù)我定義成了Object類型,如果傳別的類型的也可以,會自動調(diào)用toString()方法的。
Digester
以MD5為例:
Digester md5 = new Digester(DigestAlgorithm.MD5); // 5393554e94bf0eb6436f240a4fd71282 String digestHex = md5.digestHex(testStr);
當(dāng)然,做為最為常用的方法,MD5等方法被封裝為工具方法在DigestUtil中,以上代碼可以進(jìn)一步簡化為:
// 5393554e94bf0eb6436f240a4fd71282 String md5Hex1 = DigestUtil.md5Hex(testStr);
Hutool-http
最簡單的使用莫過于用HttpUtil工具類快速請求某個頁面:
//GET請求 String content = HttpUtil.get(url);
一行代碼即可搞定,當(dāng)然Post請求也很簡單:
//POST請求 HashMap<String, Object> paramMap = new HashMap<>(); paramMap.put("city", "北京"); String result1 = HttpUtil.post(url, paramMap);
Post請求只需使用Map預(yù)先制定form表單項(xiàng)即可。
到此這篇關(guān)于全文最詳細(xì)Hutool工具詳解的文章就介紹到這了,更多相關(guān)Hutool工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring+apollo動態(tài)獲取yaml格式的配置方式
這篇文章主要介紹了spring+apollo動態(tài)獲取yaml格式的配置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04Maven中Junit測試@Test等注解無法識別的問題及解決
這篇文章主要介紹了Maven中Junit測試@Test等注解無法識別的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11java 基礎(chǔ)之JavaBean屬性命名規(guī)范問題
這篇文章主要介紹了java 基礎(chǔ)之JavaBean屬性命名規(guī)范問題的相關(guān)資料,需要的朋友可以參考下2017-05-05Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議
這篇文章主要介紹了Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議的相關(guān)資料,非常具有參考借鑒價值,需要的朋友可以參考下2016-05-05Java 單鏈表數(shù)據(jù)結(jié)構(gòu)的增刪改查教程
這篇文章主要介紹了Java 單鏈表數(shù)據(jù)結(jié)構(gòu)的增刪改查教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10Spring Boot自定義配置屬性源(PropertySource)
這篇文章主要介紹了Spring Boot自定義配置屬性源(PropertySource),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06SpringBoot + SpringSecurity 短信驗(yàn)證碼登錄功能實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot + SpringSecurity 短信驗(yàn)證碼登錄功能實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06