Java開(kāi)發(fā)常用類庫(kù)之Hutool詳解
簡(jiǎn)介與安裝
簡(jiǎn)介
Hutool是一個(gè)小而全的Java工具類庫(kù),通過(guò)靜態(tài)方法封裝,降低相關(guān)API的學(xué)習(xí)成本,提高工作效率,使Java擁有函數(shù)式語(yǔ)言般的優(yōu)雅,讓Java語(yǔ)言也可以“甜甜的”。
Hutool中的工具方法來(lái)自每個(gè)用戶的精雕細(xì)琢,它涵蓋了Java開(kāi)發(fā)底層代碼中的方方面面,它既是大型項(xiàng)目開(kāi)發(fā)中解決小問(wèn)題的利器,也是小型項(xiàng)目中的效率擔(dān)當(dāng);
Hutool是項(xiàng)目中“util”包友好的替代,它節(jié)省了開(kāi)發(fā)人員對(duì)項(xiàng)目中公用類和公用工具方法的封裝時(shí)間,使開(kāi)發(fā)專注于業(yè)務(wù),同時(shí)可以最大限度的避免封裝不完善帶來(lái)的bug。
Hutool名稱的由來(lái)
Hutool = Hu + tool,是原公司項(xiàng)目底層代碼剝離后的開(kāi)源庫(kù),“Hu”是公司名稱的表示,tool表示工具。Hutool諧音“糊涂”,一方面簡(jiǎn)潔易懂,一方面寓意“難得糊涂”。
Hutool如何改變我們的coding方式
Hutool的目標(biāo)是使用一個(gè)工具方法代替一段復(fù)雜代碼,從而最大限度的避免“復(fù)制粘貼”代碼的問(wèn)題,徹底改變我們寫代碼的方式。
以計(jì)算MD5為例:
- 【以前】打開(kāi)搜索引擎 -> 搜“Java MD5加密” -> 打開(kāi)某篇博客-> 復(fù)制粘貼 -> 改改好用
- 【現(xiàn)在】引入Hutool -> SecureUtil.md5()
Hutool的存在就是為了減少代碼搜索成本,避免網(wǎng)絡(luò)上參差不齊的代碼出現(xiàn)導(dǎo)致的bug。
上述摘自HuTool官網(wǎng)
安裝
在Maven項(xiàng)目中
在項(xiàng)目的pom.xml的dependencies
中加入以下內(nèi)容:
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.5.8</version> </dependency>
非Maven項(xiàng)目中
點(diǎn)擊以下任一鏈接,下載hutool-all-X.X.X.jar
即可:
注意 Hutool 5.x支持JDK8+,對(duì)Android平臺(tái)沒(méi)有測(cè)試,不能保證所有工具類或工具方法可用。 如果你的項(xiàng)目使用JDK7,請(qǐng)使用Hutool 4.x版本
常用方法
本文的所有代碼均已上傳GitHub,HuTool學(xué)習(xí)
類型轉(zhuǎn)換
類型轉(zhuǎn)換的工具類為Convert
轉(zhuǎn)為字符串
// int類型轉(zhuǎn)換 int aInt = 1023; String aStr = Convert.toStr(aInt); // aStr結(jié)果為1023 System.out.println(aStr); // 數(shù)組進(jìn)行轉(zhuǎn)換 int[] bArray = {1,2,3,4,5}; String bStr = Convert.toStr(bArray); // bStr結(jié)果為[1, 2, 3, 4, 5] System.out.println(bStr);
轉(zhuǎn)為指定類型數(shù)組
String[] strArray = { "1", "0", "2", "3" }; //結(jié)果為Integer數(shù)組 Integer[] intArray = Convert.toIntArray(strArray); System.out.println(Convert.toStr(intArray)); Integer[] intArray2 = {1,0,2,3}; //結(jié)果為String數(shù)組 String[] strArray2 = Convert.toStrArray(intArray2); System.out.println(Convert.toStr(strArray2));
轉(zhuǎn)換為Date日期對(duì)象
String date = "2000-10-23"; //結(jié)果為Date日期對(duì)象 Date value = Convert.toDate(date); System.out.println(value);
轉(zhuǎn)化為L(zhǎng)ist集合
Object[] objectArray = {"lolly1023","lolly",1023}; List<?> list = Convert.convert(List.class, objectArray); System.out.println(list); // 4.1.11版本之后可使用toList List<?> list2 = Convert.toList(objectArray); System.out.println(list2);
日期時(shí)間
日期時(shí)間的工具類為DateUtil
多種獲取日期的方式
// 獲取當(dāng)前時(shí)間的Date對(duì)象 Date nowDate = DateUtil.date(); System.out.println(nowDate); // 使用Calendar獲取當(dāng)前時(shí)間的Date對(duì)象 Date nowDate2 = DateUtil.date(Calendar.getInstance()); System.out.println(nowDate2); // 使用當(dāng)前時(shí)間戳獲取當(dāng)前時(shí)間的Date對(duì)象 Date nowDate3 = DateUtil.date(System.currentTimeMillis()); System.out.println(nowDate3); // 使用工具類獲取當(dāng)前時(shí)間的字符串,格式為:yyyy-MM-dd HH:mm:ss String nowDateStr = DateUtil.now(); System.out.println(nowDateStr); // 使用工具類獲取當(dāng)前時(shí)間的字符串,格式為:yyyy-MM-dd String todayDateStr= DateUtil.today(); System.out.println(todayDateStr);
輸出樣式為:
2021-02-19 21:04:12
2021-02-19 21:04:12
2021-02-19 21:04:12
2021-02-19 21:04:12
2021-02-19
字符串轉(zhuǎn)換為Date對(duì)象
字符串轉(zhuǎn)為Date對(duì)象使用到了DateUtil
工具類中的parse
方法,該方法會(huì)自動(dòng)識(shí)別一些日期的常用格式,例如:
- yyyy-MM-dd HH:mm:ss.SSS
- yyyy-MM-dd HH:mm:ss
- yyyy-MM-dd HH:mm
- yyyy-MM-dd
- HH:mm:ss
// 字符串轉(zhuǎn)為Date對(duì)象 String dateStr = "2000-10-23 12:30"; Date date = DateUtil.parse(dateStr); // 輸出2000-10-23 12:30:00 System.out.println(date); // 也可以在轉(zhuǎn)的時(shí)候指定格式 Date date2 = DateUtil.parse(dateStr,"yyyy-MM-dd"); // 輸出2000-10-23 00:00:00 System.out.println(date2);
格式化Date對(duì)象
//格式化Date日期對(duì)象 Date date4 = DateUtil.date(); String format = DateUtil.format(date4, "yyyy年MM月dd日"); // 輸出為2021年02月19日 System.out.println(format); String formatDate = DateUtil.formatDate(date4); // 常用格式化,輸出為2021-02-19 System.out.println(formatDate); String formatDateTime = DateUtil.formatDateTime(date4); // 精確到秒,結(jié)果為2021-02-19 21:16:09 System.out.println(formatDateTime); String formatTime = DateUtil.formatTime(date4); // 只保留時(shí)分秒,結(jié)果為21:16:09 System.out.println(formatTime);
獲取Date對(duì)象的年月日
// 獲取Date對(duì)象的年月日 Date date5 = DateUtil.date(); // 獲取年,結(jié)果為2021 System.out.println(DateUtil.year(date5)); // 獲取月,結(jié)果為1(從0開(kāi)始計(jì)數(shù),0則為一月) System.out.println(DateUtil.month(date5)); // 獲取日(在本年) System.out.println(DateUtil.dayOfYear(date5)); // 獲取日(在本月) System.out.println(DateUtil.dayOfMonth(date5)); // 獲取日(在本周) System.out.println(DateUtil.dayOfWeek(date5));
開(kāi)始和結(jié)束日期
用于計(jì)算開(kāi)始時(shí)間和結(jié)束時(shí)間,有每天的,每月的,等等
Date date3 = DateUtil.date(); //一天的開(kāi)始,結(jié)果:2021-02-19 00:00:00 Date beginOfDay = DateUtil.beginOfDay(date3); System.out.println(beginOfDay); //一天的結(jié)束,結(jié)果:2021-02-19 23:59:59 Date endOfDay = DateUtil.endOfDay(date3); System.out.println(endOfDay); //一月的開(kāi)始,結(jié)果:2021-02-01 00:00:00 Date beginOfMonth = DateUtil.beginOfMonth(date3); System.out.println(beginOfMonth); //一月的結(jié)束,結(jié)果:2021-02-28 23:59:59 Date endOfMonth = DateUtil.endOfMonth(date3); System.out.println(endOfMonth);
日期時(shí)間的偏移
對(duì)日期的減少或者添加,可以對(duì)時(shí)分秒天周月等進(jìn)行更改
String dateStr2 = "2000-10-23 12:30"; Date date6 = DateUtil.parse(dateStr2); // 偏移10天 DateTime newDate = DateUtil.offsetDay(date, 10); // 結(jié)果為2000-11-02 12:30:00 System.out.println(newDate); // 偏移-10天 DateTime newDate2 = DateUtil.offsetDay(date, -10); // 結(jié)果為2000-10-13 12:30:00 System.out.println(newDate2); /**常用的偏移還有 * 月份 :DateUtil.offsetMonth(newDate2, offset) * 周:DateUtil.offsetWeek(newDate2, offset) */ // 對(duì)比這種偏移,還有一種較簡(jiǎn)單的偏移方法 //昨天 System.out.println(DateUtil.yesterday()); //明天 System.out.println(DateUtil.tomorrow()); //上周 System.out.println(DateUtil.lastWeek()); //下周 System.out.println(DateUtil.nextWeek()); //上個(gè)月 System.out.println(DateUtil.lastMonth()); //下個(gè)月 System.out.println(DateUtil.nextMonth());
日期時(shí)間差
用于計(jì)算兩個(gè)日期直接的時(shí)間差
String dateStr3 = "2000-10-23 12:30:00"; Date date7 = DateUtil.parse(dateStr3); Date date8 = DateUtil.date(); // 計(jì)算2000-10-23距今多久:7424天 long betweenDay = DateUtil.between(date7, date8, DateUnit.DAY); System.out.println(betweenDay);
計(jì)時(shí)器
TimeInterval timer = DateUtil.timer(); try { // 模擬耗時(shí)操作 Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } //花費(fèi)毫秒數(shù) System.out.println(timer.interval()); //返回花費(fèi)時(shí)間,并重置開(kāi)始時(shí)間 System.out.println(timer.intervalRestart()); //花費(fèi)分鐘數(shù) System.out.println(timer.intervalMinute());
星座與屬相
這個(gè)功能還是挺出乎意料的,沒(méi)想到還有這種
// "天秤座" String zodiac = DateUtil.getZodiac(Month.OCTOBER.getValue(), 23); System.out.println(zodiac); // "龍" String chineseZodiac = DateUtil.getChineseZodiac(2000); System.out.println(chineseZodiac);
年齡與閏年判斷
不得不說(shuō),這個(gè)工具類小玩意還挺多
//年齡 System.out.println(DateUtil.ageOfNow("2000-10-23")); //是否閏年 System.out.println(DateUtil.isLeapYear(2000));
IO流相關(guān)
文件的拷貝
// 文件的拷貝 BufferedInputStream in = FileUtil.getInputStream("d:/桌面/HuTool學(xué)習(xí).md"); BufferedOutputStream out = FileUtil.getOutputStream("d:/桌面/HuTool學(xué)習(xí)復(fù)制.md"); long copySize = IoUtil.copy(in, out, IoUtil.DEFAULT_BUFFER_SIZE); // 拷貝文件的大小 System.out.println(copySize); System.out.println("拷貝成功"); in.close(); out.close();
文件類型判斷
用于文件類型的判斷,返回值為文件的類型
File file = FileUtil.file("d:/桌面/HuTool學(xué)習(xí).md"); String type = FileTypeUtil.getType(file); //輸出的是文件的格式 Console.log(type);
文件監(jiān)聽(tīng)
在以前,我們需要監(jiān)聽(tīng)文件的變化:創(chuàng)建修改刪除等,需要進(jìn)行遍歷來(lái)定時(shí)檢查文件,效率很低,性能很差,所以有了這個(gè)工具類。
監(jiān)聽(tīng)指定事件
File file2 = FileUtil.file("example.properties"); //這里只監(jiān)聽(tīng)文件或目錄的修改事件 WatchMonitor watchMonitor = WatchMonitor.create(file2, WatchMonitor.ENTRY_MODIFY); watchMonitor.setWatcher(new Watcher(){ @Override public void onCreate(WatchEvent<?> event, Path currentPath) { Object obj = event.context(); Console.log("創(chuàng)建:{}-> {}", currentPath, obj); } @Override public void onModify(WatchEvent<?> event, Path currentPath) { Object obj = event.context(); Console.log("修改:{}-> {}", currentPath, obj); } @Override public void onDelete(WatchEvent<?> event, Path currentPath) { Object obj = event.context(); Console.log("刪除:{}-> {}", currentPath, obj); } @Override public void onOverflow(WatchEvent<?> event, Path currentPath) { Object obj = event.context(); Console.log("Overflow:{}-> {}", currentPath, obj); } }); //設(shè)置監(jiān)聽(tīng)目錄的最大深入,目錄層級(jí)大于制定層級(jí)的變更將不被監(jiān)聽(tīng),默認(rèn)只監(jiān)聽(tīng)當(dāng)前層級(jí)目錄 watchMonitor.setMaxDepth(3); //啟動(dòng)監(jiān)聽(tīng) watchMonitor.start();
監(jiān)聽(tīng)全部事件
WatchMonitor.createAll(file, new SimpleWatcher(){ @Override public void onModify(WatchEvent<?> event, Path currentPath) { Console.log("EVENT modify"); } }).start();
文件的讀取
//默認(rèn)UTF-8編碼,可以在構(gòu)造中傳入第二個(gè)參數(shù)做為編碼 FileReader fileReader = new FileReader("d:/桌面/HuTool測(cè)試.txt"); String result = fileReader.readString(); System.out.println(result);
文件的寫入
FileWriter writer = new FileWriter("d:/桌面/HuTool測(cè) 試.txt"); writer.write("添加文本",true);
文件追加
主要用于類似日志這種(此類只有在寫入文件的時(shí)候打開(kāi)文件,寫入結(jié)束之后,此類不需要關(guān)閉)
File file = new File("d:/桌面/HuTool測(cè)試.txt"); FileAppender appender = new FileAppender(file, 16, true); appender.append("lolly1023"); appender.append("追加"); appender.append("成功"); appender.flush(); appender.toString();
文件跟隨
有時(shí)候需要啟動(dòng)線程來(lái)“監(jiān)控”文件的變化,類似于Linux下的tail -f
命令
Tailer tailer = new Tailer(FileUtil.file("d:/桌面/test.log"), Tailer.CONSOLE_HANDLER, 2); tailer.start();
實(shí)時(shí)打印文件變化的類
/** * 命令行打印的行處理器 * * @author looly * @since 4.5.2 */ public static class ConsoleLineHandler implements LineHandler { @Override public void handle(String line) { Console.log(line); } }
該方法會(huì)阻塞線程
文件名與擴(kuò)展名
獲取文件名
File file = FileUtil.file("d:/桌面/HuTool學(xué)習(xí).md"); // HuTool學(xué)習(xí).md String name = FileNameUtil.getName(file); System.out.println(name);
單獨(dú)獲取主文件名與擴(kuò)展名
File file1 = FileUtil.file("d:/桌面/HuTool學(xué)習(xí).md"); // "HuTool學(xué)習(xí)" String name1 = FileNameUtil.mainName(file1); System.out.println(name1); // "md" String name2 = FileNameUtil.extName(file1); System.out.println(name2);
工具類
字符串工具
判斷是否為空
給定指定字符串,如果是空,則返回true
,使用到hasBlank
和hasEmpty
方法。hasEmpty
只判斷是否為null或者是空字符串,hasBlank
會(huì)把不可見(jiàn)的字符也算為空。
String nullStr = null; // true System.out.println(StrUtil.hasBlank(nullStr)); // true System.out.println(StrUtil.hasEmpty(nullStr));
刪除前后綴
removePrefix
為刪除字符串前綴,removeSuffix
為刪除字符串后綴,經(jīng)常用于去文件擴(kuò)展名。
String fileName = StrUtil.removeSuffix("HuTool學(xué)習(xí).md", ".md"); // HuTool學(xué)習(xí) System.out.println(fileName); String fileName1 = StrUtil.removePrefix("HuTool學(xué)習(xí).md", "HuTool學(xué)習(xí)."); // md System.out.println(fileName1);
截取字符串
在String
中就有截取字符串的方法,但是時(shí)常會(huì)越界,在這個(gè)工具類中,該方法會(huì)自動(dòng)判斷,支持負(fù)數(shù),(與python
相同),第二個(gè)位置與第一個(gè)位置搞反了的話,也會(huì)自動(dòng)識(shí)別更改。
String str = "lolly1023"; String strSub1 = StrUtil.sub(str, 0, 5); // lolly System.out.println(strSub1); String strSub2 = StrUtil.sub(str, 0, -4); // lolly System.out.println(strSub2); String strSub3 = StrUtil.sub(str, 5, 0); // lolly System.out.println(strSub3);
格式化字符串
使用{}進(jìn)行占位即可,然后使用format
方法進(jìn)行格式化
// 使用{}占位 String template = "{}+{}=2"; // 1+1=2 String str1 = StrUtil.format(template, "1", "1"); System.out.println(str1);
16進(jìn)制工具
16進(jìn)制的轉(zhuǎn)換
String str = "測(cè)試16進(jìn)制轉(zhuǎn)換"; String hex = HexUtil.encodeHexStr(str, CharsetUtil.CHARSET_UTF_8); // e6b58be8af953136e8bf9be588b6e8bdace68da2 System.out.println(hex); String decodedStr = HexUtil.decodeHexStr(hex); // 測(cè)試16進(jìn)制轉(zhuǎn)換,解碼后與str相同 System.out.println(decodedStr);
URL工具
標(biāo)準(zhǔn)化URL鏈接
對(duì)于不帶http://
頭的地址做簡(jiǎn)單補(bǔ)全。
String url = "http://www.hutool.cn//aaa/bbb"; // 結(jié)果為:http://www.hutool.cn/aaa/bbb String normalize = URLUtil.normalize(url); System.out.println(normalize); url = "http://www.hutool.cn//aaa/\\bbb?a=1&b=2"; // 結(jié)果為:http://www.hutool.cn/aaa/bbb?a=1&b=2 normalize = URLUtil.normalize(url); System.out.println(normalize);
XML工具
讀取XML
讀取XML分為兩個(gè)方法:
XmlUtil.readXML
讀取XML文件XmlUtil.parseXml
解析XML字符串為Document對(duì)象
寫XML
XmlUtil.toStr
將XML文檔轉(zhuǎn)換為String
XmlUtil.toFile
將XML文檔寫入到文件
創(chuàng)建XML
XmlUtil.createXml
創(chuàng)建XML文檔, 創(chuàng)建的XML默認(rèn)是utf8編碼,修改編碼的過(guò)程是在toStr和toFile方法里,既XML在轉(zhuǎn)為文本的時(shí)候才定義編碼。
XML操作
通過(guò)以下工具方法,可以完成基本的節(jié)點(diǎn)讀取操作。
XmlUtil.cleanInvalid
除XML文本中的無(wú)效字符
XmlUtil.getElements
根據(jù)節(jié)點(diǎn)名獲得子節(jié)點(diǎn)列表
XmlUtil.getElement
根據(jù)節(jié)點(diǎn)名獲得第一個(gè)子節(jié)點(diǎn)
XmlUtil.elementText
根據(jù)節(jié)點(diǎn)名獲得第一個(gè)子節(jié)點(diǎn)
XmlUtil.transElements
將NodeList轉(zhuǎn)換為Element列表
XML與對(duì)象轉(zhuǎn)換
writeObjectAsXml
將可序列化的對(duì)象轉(zhuǎn)換為XML寫入文件,已經(jīng)存在的文件將被覆蓋。
readObjectFromXml
從XML中讀取對(duì)象。
注意 這兩個(gè)方法嚴(yán)重依賴JDK的
XMLEncoder
和XMLDecoder
,生成和解析必須成對(duì)存在(遵循固定格式),普通的XML轉(zhuǎn)Bean會(huì)報(bào)錯(cuò)。
Xpath操作
更多Xpath操作:點(diǎn)擊此處
舉例xml文件
<?xml version="1.0" encoding="utf-8"?> <returnsms> <returnstatus>Success(成功)</returnstatus> <message>ok</message> <remainpoint>1490</remainpoint> <taskID>885</taskID> <successCounts>1</successCounts> </returnsms>
java代碼
File xmlFile = new File("/Study/HuToolTest/src/main/java/com/rj/bd/HuToolTest/UTilTest/URLUtil/Test.xml"); Document docResult=XmlUtil.readXML(xmlFile); Object value = XmlUtil.getByXPath("http://returnsms/message", docResult, XPathConstants.STRING); // ok System.out.println(value.toString());
對(duì)象工具 兩個(gè)對(duì)象是否相等
需要滿足:
obj1 == null && obj2 == null
obj1.equals(obj2)
才會(huì)返回true
String string1 = "1"; Integer integer1 = 1; // false System.out.println(ObjectUtil.equal(string1, integer1));
計(jì)算對(duì)象長(zhǎng)度
其實(shí)本質(zhì)就是調(diào)用不同對(duì)象的計(jì)算長(zhǎng)度方法,支持的類型有:
- CharSequence
- Collection
- Map
- Iterator
- Enumeration
- Array
List<Integer> list = new ArrayList<Integer>(); // 0 System.out.println(ObjectUtil.length(list));
判斷是否包含元素
即為判斷對(duì)象中是否包含元素
List<Integer> list1 = new ArrayList<Integer>(); list1.add(0); // true System.out.println(ObjectUtil.contains(list1, 0));
判斷是否為空
List<Integer> list2 = new ArrayList<Integer>(); // false System.out.println(ObjectUtil.isNull(list2)); // true System.out.println(ObjectUtil.isNotNull(list2));
克隆
ObjectUtil.clone
克隆對(duì)象,如果對(duì)象實(shí)現(xiàn)Cloneable
接口,調(diào)用其clone
方法,如果實(shí)現(xiàn)Serializable
接口,執(zhí)行深度克隆,否則返回null
。
ObjectUtil.cloneIfPossible
返回克隆后的對(duì)象,如果克隆失敗,返回原對(duì)象
ObjectUtil.cloneByStream
序列化后拷貝流的方式克隆,對(duì)象必須實(shí)現(xiàn)Serializable
接口
序列化與反序列化 serialize
序列化,調(diào)用JDK序列化unserialize
反序列化,調(diào)用JDK 判斷基本類型
如果該對(duì)象是基本類型,則返回true,反之返回false。
int i = 0; // true System.out.println(ObjectUtil.isBasicType(i));
反射 獲取某類的全部方法
// 獲取類中的全部方法 Method[] methods = ReflectUtil.getMethods(Test.class);
獲取某類的某個(gè)方法
// 獲取類中的某個(gè)方法 Method method = ReflectUtil.getMethod(Test.class, "getID");
獲取某類的構(gòu)造方法
// 獲取某類的構(gòu)造方法 ReflectUtil.newInstance(Test.class);
執(zhí)行方法
public class TestClass { public String print(String string) { return string; } }
測(cè)試類
TestClass testClass = new TestClass(); // lolly1023 ReflectUtil.invoke(testClass, "print", "lolly1023");
剪切板工具 獲取剪切板內(nèi)容及修改剪切板內(nèi)容
// 獲取系統(tǒng)剪切板內(nèi)容 Clipboard copy = ClipboardUtil.getClipboard(); // 設(shè)置剪切板內(nèi)容,圖片的話使用setImage ClipboardUtil.setStr("123"); // 獲取剪切板內(nèi)容:123,圖片的話使用getImage System.out.println(ClipboardUtil.getStr());
命令行工具
通過(guò)Java代碼執(zhí)行命令行命令,在Wubdows
下是cmd
,在Linux
下是shell命令
執(zhí)行命令
// cmd下輸入ipconfig為網(wǎng)卡信息 String str = RuntimeUtil.execForStr("ipconfig"); // 輸出正常,為網(wǎng)卡信息 System.out.println(str);
數(shù)字工具 加減乘除
NumberUtil.add
針對(duì)double類型做加法
NumberUtil.sub
針對(duì)double類型做減法
NumberUtil.mul
針對(duì)double類型做乘法
NumberUtil.div
針對(duì)double類型做除法,并提供重載方法用于規(guī)定除不盡的情況下保留小數(shù)位數(shù)和舍棄方式。
以上的方法都會(huì)將double
轉(zhuǎn)為BigDecimal
,解決了精確問(wèn)題。
保留小數(shù)
double te1=123456.123456; double te2=123456.123456; // 第二個(gè)參數(shù)為保留幾位小數(shù) // 123456.1 Console.log(NumberUtil.round(te1,1)); // 123456.123 Console.log(NumberUtil.round(te2,3));
四舍五入
double te3=123456.123456; double te4=123456.128456; // 第二個(gè)參數(shù)為保留幾位小數(shù) //123456.12 Console.log(NumberUtil.roundStr(te3,2)); //123456.13 Console.log(NumberUtil.roundStr(te4,2));
格式化
long c=299792458;//光速 String format = NumberUtil.decimalFormat(",###", c);//299,792,458 System.out.println(format);
常用的格式化方式
0
-> 取一位整數(shù)
0.00
-> 取一位整數(shù)和兩位小數(shù)
00.000
-> 取兩位整數(shù)和三位小數(shù)
#
-> 取所有整數(shù)部分
#.##%
-> 以百分比方式計(jì)數(shù),并取兩位小數(shù)
#.#####E0
-> 顯示為科學(xué)計(jì)數(shù)法,并取五位小數(shù),###
-> 每三位以逗號(hào)進(jìn)行分隔,例如:299,792,458
光速大小為每秒,###米
-> 將格式嵌入文本
更多格式化操作,點(diǎn)擊處此
是否為數(shù)字
NumberUtil.isNumber
是否為數(shù)字
NumberUtil.isInteger
是否為整數(shù)
NumberUtil.isDouble
是否為浮點(diǎn)數(shù)
NumberUtil.isPrimes
是否為質(zhì)數(shù) 隨機(jī)數(shù)
第一個(gè)參數(shù)為最小值,第二個(gè)參數(shù)為最大值,第三個(gè)參數(shù)為長(zhǎng)度。
// 生成隨機(jī)數(shù),用int類型數(shù)組承載 int[] array = NumberUtil.generateRandomNumber(0, 10, 8); System.out.println(Convert.toStr(array)); // 生成隨機(jī)數(shù),用Integer類型數(shù)組承載 Integer[] array2 = NumberUtil.generateBySet(0, 10, 8); System.out.println(Convert.toStr(array2));
有序整數(shù)列表
生成一個(gè)有序的int類型數(shù)組
// 第一個(gè)參數(shù)為起點(diǎn),第二個(gè)參數(shù)為終點(diǎn) int[] array3 = NumberUtil.range(2, 5); // [2, 3, 4, 5] System.out.println(Convert.toStr(array3));
其它
NumberUtil.factorial
階乘
NumberUtil.sqrt
平方根
NumberUtil.divisor
最大公約數(shù)
NumberUtil.multiple
最小公倍數(shù)
NumberUtil.getBinaryStr
獲得數(shù)字對(duì)應(yīng)的二進(jìn)制字符串
NumberUtil.binaryToInt
二進(jìn)制轉(zhuǎn)int
NumberUtil.binaryToLong
二進(jìn)制轉(zhuǎn)long
NumberUtil.compare
比較兩個(gè)值的大小
NumberUtil.toStr
數(shù)字轉(zhuǎn)字符串,自動(dòng)并去除尾小數(shù)點(diǎn)兒后多余的0
數(shù)組工具
判斷是否為空
int[] a = {}; int[] b = null; // 判斷空 // true System.out.println(ArrayUtil.isEmpty(a)); // true System.out.println(ArrayUtil.isEmpty(b)); //判斷非空 // false System.out.println(ArrayUtil.isNotEmpty(a));
新建泛型數(shù)組
該方法支持泛型返回值
String[] newArray = ArrayUtil.newArray(String.class, 3);
調(diào)整大小
ArrayUtil.resize(newArray, 4);
合并數(shù)組
int[] c = {1,2,3}; int[] d = {4,5,6}; int[] e = ArrayUtil.addAll(c,d); // [1, 2, 3, 4, 5, 6] System.out.println(Convert.toStr(e));
克隆
泛型數(shù)組調(diào)用原生克隆
Integer[] b = {1,2,3}; Integer[] cloneB = ArrayUtil.clone(b); Assert.assertArrayEquals(b, cloneB);
非泛型數(shù)組(原始類型數(shù)組)調(diào)用第二種重載方法
int[] a = {1,2,3}; int[] clone = ArrayUtil.clone(a); Assert.assertArrayEquals(a, clone);
有序列表生成
int[] array = ArrayUtil.range(0,10); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] System.out.println(Convert.toStr(array));
拆分?jǐn)?shù)組
byte[] array2 = {1,1,1,1,2,2,2,2}; byte[][] array3 = ArrayUtil.split(array2, 4); // [[1, 1, 1, 1], [2, 2, 2, 2]] System.out.println(Convert.toStr(array3));
過(guò)濾
舉例,過(guò)濾數(shù)組,保留偶數(shù)
Integer[] a = {1,2,3,4,5,6}; Integer[] filter = ArrayUtil.filter(a, new Editor<Integer>(){ @Override public Integer edit(Integer t) { return (t % 2 == 0) ? t : null; }}); Assert.assertArrayEquals(filter, new Integer[]{2,4,6});
兩個(gè)數(shù)組生成map
此方法在python
中為zip()
函數(shù)。
第一個(gè)數(shù)組為key,第二個(gè)數(shù)組對(duì)應(yīng)為value。
String[] keys = {"w", "e", "r", "f"}; Integer[] values = {1,0,2,3}; Map<String, Integer> map = ArrayUtil.zip(keys, values, true); // {w=1, e=0, r=2, f=3} System.out.println(Convert.toStr(map));
是否包含元素
int[] f = {1,2,3}; // true System.out.println(ArrayUtil.contains(f, 3));
判斷對(duì)象是否為數(shù)組
int[] g = {1,2,3}; int h = 1; // true System.out.println(ArrayUtil.isArray(g)); // false System.out.println(ArrayUtil.isArray(h));
轉(zhuǎn)為字符串
int[] i = {1,2,3}; // [1, 2, 3] System.out.println(ArrayUtil.toString(i)); // 第二個(gè)參數(shù)為間隔符, 1/2/3 System.out.println(ArrayUtil.join(i, "/"));
隨機(jī)工具
基本使用
RandomUtil.randomInt
獲得指定范圍內(nèi)的隨機(jī)數(shù)
RandomUtil.randomBytes
隨機(jī)bytes
RandomUtil.randomEle
隨機(jī)獲得列表中的元素
RandomUtil.randomEleSet
隨機(jī)獲得列表中的一定量的不重復(fù)元素,返回Set
RandomUtil.randomString
獲得一個(gè)隨機(jī)的字符串(只包含數(shù)字和字符)
RandomUtil.randomNumbers
獲得一個(gè)只包含數(shù)字的字符串
RandomUtil.randomUUID
隨機(jī)UUID
RandomUtil.weightRandom
權(quán)重隨機(jī)生成器,傳入帶權(quán)重的對(duì)象,然后根據(jù)權(quán)重隨機(jī)獲取對(duì)象
唯一ID工具
UUID
UUID全稱通用唯一識(shí)別碼(universally unique identifier)
//生成的UUID是帶-的字符串 String uuid = IdUtil.randomUUID(); System.out.println(uuid); //生成的是不帶-的字符串 String simpleUUID = IdUtil.simpleUUID(); System.out.println(simpleUUID);
ObjectId
ObjectId是MongoDB數(shù)據(jù)庫(kù)的一種唯一ID生成策略,是UUID version1的變種。
//生成id String id = ObjectId.next(); System.out.println(id); //方法2:從Hutool-4.1.14開(kāi)始提供 String id2 = IdUtil.objectId(); System.out.println(id2);
Snowflake
分布式系統(tǒng)中,有一些需要使用全局唯一ID的場(chǎng)景,有些時(shí)候我們希望能使用一種簡(jiǎn)單一些的ID,并且希望ID能夠按照時(shí)間有序生成。Twitter的Snowflake 算法就是這種生成器。
//參數(shù)1為終端ID //參數(shù)2為數(shù)據(jù)中心ID Snowflake snowflake = IdUtil.getSnowflake(1, 1); long id3 = snowflake.nextId(); System.out.println(id3);
壓縮工具
壓縮
打包到當(dāng)前目錄
//將aaa目錄下的所有文件目錄打包到d:/aaa.zip ZipUtil.zip("d:/aaa");
打包到指定目錄
//將aaa目錄下的所有文件目錄打包到d:/bbb/目錄下的aaa.zip文件中 // 此處第二個(gè)參數(shù)必須為文件,不能為目錄 ZipUtil.zip("d:/aaa", "d:/bbb/aaa.zip"); //將aaa目錄下的所有文件目錄打包到d:/bbb/目錄下的ccc.zip文件中 ZipUtil.zip("d:/aaa", "d:/bbb/ccc.zip");
多個(gè)文件進(jìn)行打包
ZipUtil.zip(FileUtil.file("d:/bbb/ccc.zip"), false, FileUtil.file("d:/test1/file1.txt"), FileUtil.file("d:/test1/file2.txt"), FileUtil.file("d:/test2/file1.txt"), FileUtil.file("d:/test2/file2.txt") );
解壓
//將test.zip解壓到e:\\aaa目錄下,返回解壓到的目錄 File unzip = ZipUtil.unzip("E:\\aaa\\test.zip", "e:\\aaa");
身份證工具
主要方法為:
isValidCard
驗(yàn)證身份證是否合法
convert15To18
身份證15位轉(zhuǎn)18位
getBirthByIdCard
獲取生日
getAgeByIdCard
獲取年齡
getYearByIdCard
獲取生日年
getMonthByIdCard
獲取生日月
getDayByIdCard
獲取生日天
getGenderByIdCard
獲取性別
getProvinceByIdCard
獲取省份
簡(jiǎn)單使用
String ID_18 = "321083197812162119"; String ID_15 = "150102880730303"; //是否有效 boolean valid = IdcardUtil.isValidCard(ID_18); boolean valid15 = IdcardUtil.isValidCard(ID_15); //轉(zhuǎn)換 String convert15To18 = IdcardUtil.convert15To18(ID_15); Assert.assertEquals(convert15To18, "150102198807303035"); //年齡 DateTime date = DateUtil.parse("2017-04-10"); int age = IdcardUtil.getAgeByIdCard(ID_18, date); Assert.assertEquals(age, 38); int age2 = IdcardUtil.getAgeByIdCard(ID_15, date); Assert.assertEquals(age2, 28); //生日 String birth = IdcardUtil.getBirthByIdCard(ID_18); Assert.assertEquals(birth, "19781216"); String birth2 = IdcardUtil.getBirthByIdCard(ID_15); Assert.assertEquals(birth2, "19880730"); //省份 String province = IdcardUtil.getProvinceByIdCard(ID_18); Assert.assertEquals(province, "江蘇"); String province2 = IdcardUtil.getProvinceByIdCard(ID_15); Assert.assertEquals(province2, "內(nèi)蒙古");
聲明本次數(shù)據(jù)摘自HuTool官網(wǎng),為隨即編造,如有雷同,純屬巧合。
集合類
集合工具
轉(zhuǎn)為字符串
第二個(gè)參數(shù)為連接符
String[] col= new String[]{"l","o","l","l","y"}; List<String> colList = CollUtil.newArrayList(col); String str = CollUtil.join(colList, "#"); // l#o#l#l#y System.out.println(str);
分頁(yè)
//Integer比較器 Comparator<Integer> comparator = new Comparator<Integer>(){ @Override public int compare(Integer o1, Integer o2) { return o1.compareTo(o2); } }; //新建三個(gè)列表,CollUtil.newArrayList方法表示新建ArrayList并填充元素 List<Integer> list1 = CollUtil.newArrayList(1, 2, 3); List<Integer> list2 = CollUtil.newArrayList(4, 5, 6); List<Integer> list3 = CollUtil.newArrayList(7, 8, 9); //參數(shù)表示把list1,list2,list3合并并按照從小到大排序后,取0~2個(gè)(包括第0個(gè),不包括第2個(gè)),結(jié)果是[1,2] @SuppressWarnings("unchecked") List<Integer> result = CollUtil.sortPageAll(0, 2, comparator, list1, list2, list3); System.out.println(result); //輸出 [1,2]
可能接觸時(shí)間有點(diǎn)少,沒(méi)讀太懂,直接略過(guò)了。
創(chuàng)建容器
HashMap<String, String> map = CollUtil.newHashMap(); HashSet<String> set = CollUtil.newHashSet(); ArrayList<String> list = CollUtil.newArrayList();
添加元素
CollUtil.setOrAppend(list, 0, "1"); System.out.println(list);
調(diào)整數(shù)據(jù)大小
List<String> list5 = CollUtil.reverse(list);
沒(méi)有搞懂改變List大小有啥用。。。,希望有會(huì)的指點(diǎn)一下
合并數(shù)組
List<String> list4 = new ArrayList<>(); List<String> list6 = new ArrayList<>(); list4.add("lolly"); list6.add("lolly1023"); CollUtil.addAll(list4, list6); // [lolly, lolly1023] System.out.println(list4);
截取數(shù)組
// [lolly] System.out.println(CollUtil.sub(list4, 0, 1));
判斷是否為空
// false System.out.println(CollUtil.isEmpty(list4)); // true System.out.println(CollUtil.isNotEmpty(list4));
集合生成Map
源自python語(yǔ)法糖
Collection<String> keys = CollUtil.newArrayList("a", "b", "c", "d"); Collection<Integer> values = CollUtil.newArrayList(1, 2, 3, 4); // {a=1,b=2,c=3,d=4} Map<String, Integer> map = CollUtil.zip(keys, values);
過(guò)濾方法
此方法可以過(guò)濾掉map中不需要的key
舉例:
@Test public void CollUtil_Filter() { Map<String, Object> m = new HashMap<String, Object>() {{ put("k1", "v1"); put("k2", "v2"); put("k3", "v3"); }}; String[] inc = {"k1", "k3"};//需要的key List<String> incList = Arrays.asList(inc); m = CollectionUtil.filter(m, new Editor<Map.Entry<String, Object>>() { @Override public Map.Entry<String, Object> edit(Map.Entry<String, Object> stringObjectEntry) { if (incList.contains(stringObjectEntry.getKey())) { return stringObjectEntry; } return null; } }); log.info("{}", m); }
控制臺(tái)輸出
{k3=v3, k1=v1}
列表工具
過(guò)濾列表
對(duì)每一個(gè)元素進(jìn)行過(guò)濾
List<String> a = ListUtil.toLinkedList("1", "2", "3"); // 結(jié)果: [edit1, edit2, edit3] List<String> filter = ListUtil.filter(a, str -> "edit" + str);
獲取滿足規(guī)則元素下標(biāo)
List<String> a = ListUtil.toLinkedList("1", "2", "3", "4", "3", "2", "1"); // [1, 5] int[] indexArray = ListUtil.indexOfAll(a, "2"::equals);
Iterator工具
基本方法
isEmpty
是否為null或者無(wú)元素
isNotEmpty
是否為非null或者至少一個(gè)元素
hasNull
是否有null元素
isAllNull
是否全部為null元素
countMap
根據(jù)集合返回一個(gè)元素計(jì)數(shù)的Map,所謂元素計(jì)數(shù)就是假如這個(gè)集合中某個(gè)元素出現(xiàn)了n次,那將這個(gè)元素做為key,n做為value
join
使用分隔符將集合轉(zhuǎn)換為字符串
toMap
toMap Entry列表轉(zhuǎn)Map,或者key和value單獨(dú)列表轉(zhuǎn)Map
asIterator
Enumeration
轉(zhuǎn)Iterator
asIterable
Iterator
轉(zhuǎn)Iterable
getFirst
獲取列表的第一個(gè)元素
getElementType
獲取元素類型
Map
Map工具
行轉(zhuǎn)列
如若map中的數(shù)據(jù)為:
[ {a: 1, b: 1, c: 1}, {a: 2, b: 2}, {a: 3, b: 3}, {a: 4} ]
則使用toListMap
之后變?yōu)椋?/p>
{ a: [1,2,3,4], b: [1,2,3,], c: [1] }
列轉(zhuǎn)行
如若map中的數(shù)據(jù)為:
{ a: [1,2,3,4], b: [1,2,3,], c: [1] }
則使用toMapList
之后變?yōu)椋?/p>
[ {a: 1, b: 1, c: 1}, {a: 2, b: 2}, {a: 3, b: 3}, {a: 4} ]
轉(zhuǎn)為字符串
join
、joinIgnoreNull
、sortJoin
將Map按照給定的分隔符轉(zhuǎn)換為字符串,此方法一般用于簽名。
Map<String, String> build = MapUtil.builder(new HashMap<String, String>()) .put("key1", "value1") .put("key3", "value3") .put("key2", "value2").build(); // key1value1key2value2key3value3 String join1 = MapUtil.sortJoin(build, StrUtil.EMPTY, StrUtil.EMPTY, false); // key1value1key2value2key3value3123 String join2 = MapUtil.sortJoin(build, StrUtil.EMPTY, StrUtil.EMPTY, false, "123");
過(guò)濾方法
舉例:
Map<String, String> map = MapUtil.newHashMap(); map.put("a", "1"); map.put("b", "2"); map.put("c", "3"); map.put("d", "4"); Map<String, String> map2 = MapUtil.filter(map, (Filter<Entry<String, String>>) t -> Convert.toIn(t.getValue()) % 2 == 0);
結(jié)果為:
{
b: "2",
d: "4"
}
key和value互換
舉例:
Map<String, String> map = MapUtil.newHashMap(); map.put("a", "1"); map.put("b", "2"); map.put("c", "3"); map.put("d", "4"); Map<String, String> map2 = MapUtil.reverse(map);
結(jié)果為:
{
"1": "a",
"2": "b",
"3": "c",
"4": "d",
}
BiMap
BiMap,它實(shí)現(xiàn)了一種雙向查找的功能,即根據(jù)key查找value和根據(jù)value查找key,Hutool也同樣提供此對(duì)象。
基本使用
BiMap<String, Integer> biMap = new BiMap<>(new HashMap<>()); biMap.put("aaa", 111); biMap.put("bbb", 222); // 111 biMap.get("aaa"); // 222 biMap.get("bbb"); // aaa biMap.getKey(111); // bbb biMap.getKey(222);
TableMap
TableMap這類數(shù)據(jù)結(jié)構(gòu),通過(guò)鍵值單獨(dú)建立List方式,使鍵值對(duì)一一對(duì)應(yīng),實(shí)現(xiàn)正向和反向兩種查找。
基本使用
TableMap<String, Integer> tableMap = new TableMap<>(new HashMap<>()); tableMap.put("aaa", 111); tableMap.put("bbb", 222); // 111 tableMap.get("aaa"); // 222 tableMap.get("bbb"); // aaa tableMap.getKey(111); // bbb tableMap.getKey(222); // [111] tableMap.getValues("aaa"); //[aaa] tableMap.getKeys(111);
Codec編碼
Base62編碼解碼
String a = "Base62"; // KixpUr22 String encode = Base62.encode(a); System.out.println(encode); // 還原為Base62 String decodeStr = Base62.decodeStr(encode); System.out.println(decodeStr);
Base64編碼解碼
String a = "Base64"; // QmFzZTY0 String encode = Base64.encode(a); System.out.println(encode); // 還原為Base64 String decodeStr = Base64.decodeStr(encode); System.out.println(decodeStr);
Base32編碼解碼
String a = "Base32"; // IJQXGZJTGI String encode = Base32.encode(a); System.out.println(encode); // 還原為Base32 String decodeStr = Base32.decodeStr(encode); System.out.println(decodeStr);
文本操作 StrBuilder
在JDK提供的StringBuilder中,拼接字符串變得更加高效和靈活,但是生成新的字符串需要重新構(gòu)建StringBuilder對(duì)象,造成性能損耗和內(nèi)存浪費(fèi),因此Hutool提供了可復(fù)用的StrBuilder。
摘自HuTool官網(wǎng)
基本使用
StrBuilder builder = StrBuilder.create(); builder.append("lolly").append("1023").append('!'); // lolly1023! System.out.println(builder);
對(duì)比StringBuilder
來(lái)說(shuō),性能幾乎提升一倍之高。
Unicode編碼轉(zhuǎn)換工具
字符串轉(zhuǎn)Unicode符
//第二個(gè)參數(shù)true表示跳過(guò)ASCII字符(只跳過(guò)可見(jiàn)字符) String s = UnicodeUtil.toUnicode("lolly1023中文", true); // lolly1023\u4e2d\u6587 System.out.println(s);
Unicode轉(zhuǎn)字符串
String str = "lolly1023\u4e2d\u6587"; String res = UnicodeUtil.toString(str); // lolly1023中文 System.out.println(res);
比較器
版本比較器
// 1.2.1 < 1.12.1,返回-1 System.out.println(VersionComparator.INSTANCE.compare("1.2.1", "1.12.1")); // 1.12.1 < 1.12.1c,返回-1 System.out.println(VersionComparator.INSTANCE.compare("1.12.1", "1.12.1c")); // V0.0.20170102 > V0.0.20170101,返回1 System.out.println(VersionComparator.INSTANCE.compare("V0.0.20170102", "V0.0.20170101"));
其它比較器
ReverseComparator
反轉(zhuǎn)比較器,排序時(shí)提供反序
VersionComparator
版本比較器,支持如:1.3.20.8,6.82.20160101,8.5a/8.5c等版本形式
PropertyComparator
Bean屬性比較器,通過(guò)Bean的某個(gè)屬性來(lái)對(duì)Bean對(duì)象進(jìn)行排序
IndexedComparator
按照數(shù)組的順序正序排列,數(shù)組的元素位置決定了對(duì)象的排序先后
ComparatorChain
比較器鏈。此鏈包裝了多個(gè)比較器,最終比較結(jié)果按照比較器順序綜合多個(gè)比較器結(jié)果。PinyinComparator
按照GBK拼音順序對(duì)給定的漢字字符串排序。
異常
基本方法
getMessage
獲得完整消息,包括異常名
wrap
包裝一個(gè)異常為指定類型異常
wrapRuntime
使用運(yùn)行時(shí)異常包裝編譯異常
getCausedBy
獲取由指定異常類引起的異常
isCausedBy
判斷是否由指定異常類引起
stacktraceToString
堆棧轉(zhuǎn)為完整字符串
其他方法請(qǐng)參考API文檔:API文檔
其它異常封裝
DependencyException
依賴異常
StatefulException
帶有狀態(tài)碼的異常
UtilException
工具類異常
NotInitedException
未初始化異常
ValidateException
驗(yàn)證異常
圖片
圖片工具
縮放圖片
ImgUtil.scale( FileUtil.file("d:/桌面/石原里美.jpg"), FileUtil.file("d:/桌面/石原里美縮小版.jpg"), 0.5f// 縮放比例 );
剪裁圖片
ImgUtil.cut( FileUtil.file("d:/桌面/石原里美.jpg"), FileUtil.file("d:/桌面/石原里美剪裁版.jpg"), new Rectangle(200, 200, 200, 200)//裁剪的矩形區(qū)域 );
分成行列剪裁
ImgUtil.slice( FileUtil.file("d:/桌面/石原里美.jpg"), FileUtil.file("d:/桌面/石原里美"), 2, 2 );
圖片類型轉(zhuǎn)換
ImgUtil.convert( FileUtil.file("d:/桌面/石原里美.jpg"), FileUtil.file("d:/桌面/石原里美.png") );
圖片轉(zhuǎn)為黑白
ImgUtil.gray( FileUtil.file("d:/桌面/石原里美.jpg"), FileUtil.file("d:/桌面/石原里美黑白版.jpg") );
添加文字水印
ImgUtil.pressText(// FileUtil.file("d:/桌面/石原里美.jpg"), // FileUtil.file("d:/桌面/石原里美水印版.jpg"), // "lolly1023", Color.WHITE, //文字 new Font("黑體", Font.BOLD, 100), //字體 0, //x坐標(biāo)修正值。 默認(rèn)在中間,偏移量相對(duì)于中間偏移 0, //y坐標(biāo)修正值。 默認(rèn)在中間,偏移量相對(duì)于中間偏移 0.8f//透明度:alpha 必須是范圍 [0.0, 1.0] 之內(nèi)(包含邊界值)的一個(gè)浮點(diǎn)數(shù)字 );
添加圖片水印
ImgUtil.pressImage( FileUtil.file("d:/桌面/石原里美.jpg"), FileUtil.file("d:/桌面/石原里美圖片水印版.jpg"), ImgUtil.read(FileUtil.file("d:/桌面/石原里美.jpg")), //水印圖片 0, //x坐標(biāo)修正值。 默認(rèn)在中間,偏移量相對(duì)于中間偏移 0, //y坐標(biāo)修正值。 默認(rèn)在中間,偏移量相對(duì)于中間偏移 0.1f );
旋轉(zhuǎn)圖片
// 旋轉(zhuǎn)180度 BufferedImage image = (BufferedImage) ImgUtil.rotate(ImageIO.read(FileUtil.file("d:/桌面/石原里美.jpg")), 180); ImgUtil.write(image, FileUtil.file("d:/桌面/石原里美旋轉(zhuǎn)版.jpg"));
水平翻轉(zhuǎn)圖片
ImgUtil.flip( FileUtil.file("d:/桌面/石原里美.jpg"), FileUtil.file("d:/桌面/石原里美翻轉(zhuǎn)版.jpg") );
圖片編輯器
圖像切割
Img.from( FileUtil.file("d:/桌面/石原里美.jpg")) .cut(0, 0, 200)// .write(FileUtil.file("d:/桌面/石原里美切割版.jpg") );
圖片壓縮
圖片壓縮只支持jpg文件
Img.from( FileUtil.file("d:/桌面/石原里美.jpg")) .setQuality(0.5)//壓縮比率 .write(FileUtil.file("d:/桌面/石原里美壓縮版.jpg") );
HuTool暫未學(xué)完,持續(xù)更新
本文的所有代碼均已上傳GitHub,HuTool學(xué)習(xí)
到此這篇關(guān)于Java開(kāi)發(fā)常用類庫(kù)之Hutool的文章就介紹到這了,更多相關(guān)Java Hutool類庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Java日志框架slf4j作用及其實(shí)現(xiàn)原理
日志記錄是應(yīng)用程序運(yùn)行中必不可少的一部分。這篇文章主要介紹了淺談Java日志框架slf4j作用及其實(shí)現(xiàn)原理,SLF4J是一個(gè)日志框架抽象層,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Springboot實(shí)現(xiàn)給前端返回一個(gè)tree結(jié)構(gòu)方法
這篇文章主要介紹了SpringBoot返回給前端一個(gè)tree結(jié)構(gòu)的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07解決springboot項(xiàng)目上傳文件出現(xiàn)臨時(shí)文件目錄為空的問(wèn)題
這篇文章主要介紹了解決springboot項(xiàng)目上傳文件出現(xiàn)臨時(shí)文件目錄為空的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09SpringBoot應(yīng)用能直接運(yùn)行java -jar的原因分析
這篇文章主要介紹了SpringBoot應(yīng)用為什么能直接運(yùn)行java -jar,首先明確一點(diǎn),普通jar包是不能直接運(yùn)行的,比如工具類jar,要能運(yùn)行,至少得要一個(gè)main函數(shù)作為入口吧?本文給大家介紹了詳細(xì)的原因分析,需要的朋友可以參考下2024-03-03java socket長(zhǎng)連接中解決read阻塞的3個(gè)辦法
這篇文章主要介紹了java socket長(zhǎng)連接中解決read阻塞的3個(gè)辦法,本文取了折中的一個(gè)方法,并給出代碼實(shí)例,需要的朋友可以參考下2014-08-08SpringCloud中的熔斷監(jiān)控HystrixDashboard和Turbine示例詳解
HystrixDashboard是用于實(shí)時(shí)監(jiān)控Hystrix性能的工具,展示請(qǐng)求響應(yīng)時(shí)間和成功率等數(shù)據(jù),本文介紹了如何配置和使用HystrixDashboard和Turbine進(jìn)行熔斷監(jiān)控,包括依賴添加、啟動(dòng)類配置和測(cè)試流程,感興趣的朋友一起看看吧2024-09-09