java開(kāi)發(fā)常用工具類(lèi)(持續(xù)更新)

[TOC]

1 場(chǎng)景

本文主要記錄java開(kāi)發(fā)中莺丑,常用的外部工具類(lèi),使用這些工具類(lèi)能大大提高開(kāi)發(fā)的效率代碼的健壯性蛾扇。

因?yàn)闀r(shí)間問(wèn)題歇盼,本文將慢慢持續(xù)更新完善舔痕。

本文基于JDK1.8

2 相關(guān)maven依賴

2.1 commons-lang3

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

2.2 commons-collections4

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

2.3 commons-text

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-text</artifactId>
    <version>1.9</version>
</dependency>

2.4 commons-codec

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>

2.5 commons-io

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.9.0</version>
</dependency>

2.6 commons-csv

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.8</version>
</dependency>

3 字符串相關(guān)

3.1 JDK

相關(guān)類(lèi):java.lang.String

3.1.1 數(shù)組、集合指定分隔符分隔
String[] arr = new String[]{"1", "2", "3"};
// 轉(zhuǎn)換數(shù)組豹缀,結(jié)果:1,2,3
String result1 = String.join(",", arr);

List<String> list = Stream.of(arr).collect(Collectors.toList());
// 轉(zhuǎn)換集合伯复,結(jié)果:1,2,3
String result2 = String.join(",", list);

3.2 commons-lang3包

相關(guān)類(lèi):

org.apache.commons.lang3.StringUtils

org.apache.commons.lang3.RandomStringUtils

3.2.1 字符串判空
/**
 * StringUtils.isEmpty(null)      = true
 * StringUtils.isEmpty("")        = true
 * StringUtils.isEmpty(" ")       = false
 * StringUtils.isEmpty("bob")     = false
 * StringUtils.isEmpty("  bob  ") = false
 */
boolean result = StringUtils.isEmpty(str);
boolean result = StringUtils.isNotEmpty(str);

/**
 * StringUtils.isBlank(null)      = true
 * StringUtils.isBlank("")        = true
 * StringUtils.isBlank(" ")       = true
 * StringUtils.isBlank("bob")     = false
 * StringUtils.isBlank("  bob  ") = false
 */
boolean result = StringUtils.isBlank(str);
boolean result = StringUtils.isNotEmpty(str);
3.2.2 字符串判斷相等
/**
 * StringUtils.equals(null, null)   = true
 * StringUtils.equals(null, "abc")  = false
 * StringUtils.equals("abc", null)  = false
 * StringUtils.equals("abc", "abc") = true
 * StringUtils.equals("abc", "ABC") = false
 */
boolean result = StringUtils.equals(null, "123");
3.2.3 是否包含子字符串
/**
 * StringUtils.contains(null, *)     = false
 * StringUtils.contains(*, null)     = false
 * StringUtils.contains("", "")      = true
 * StringUtils.contains("abc", "")   = true
 * StringUtils.contains("abc", "a")  = true
 * StringUtils.contains("abc", "z")  = false
 */
boolean result = StringUtils.contains("abcd", "ab");
3.3.4 判斷以某字符串開(kāi)頭

/**
 * StringUtils.startsWith(null, null)      = true
 * StringUtils.startsWith(null, "abc")     = false
 * StringUtils.startsWith("abcdef", null)  = false
 * StringUtils.startsWith("abcdef", "abc") = true
 * StringUtils.startsWith("ABCDEF", "abc") = false
 */
boolean result = StringUtils.startsWith("abcd","ab");
2.3.5 判斷以某字符串結(jié)尾
/**
 * StringUtils.endsWith(null, null)      = true
 * StringUtils.endsWith(null, "def")     = false
 * StringUtils.endsWith("abcdef", null)  = false
 * StringUtils.endsWith("abcdef", "def") = true
 * StringUtils.endsWith("ABCDEF", "def") = false
 * StringUtils.endsWith("ABCDEF", "cde") = false
 * StringUtils.endsWith("ABCDEF", "")    = true
 */
boolean result = StringUtils.endsWith("abcd","cd");
3.3.4 補(bǔ)全字符串
/**
 * StringUtils.leftPad(null, *, *)      = null
 * StringUtils.leftPad("", 3, "z")      = "zzz"
 * StringUtils.leftPad("bat", 3, "yz")  = "bat"
 * StringUtils.leftPad("bat", 5, "yz")  = "yzbat"
 * StringUtils.leftPad("bat", 8, "yz")  = "yzyzybat"
 * StringUtils.leftPad("bat", 1, "yz")  = "bat"
 * StringUtils.leftPad("bat", -1, "yz") = "bat"
 * StringUtils.leftPad("bat", 5, null)  = "  bat"
 * StringUtils.leftPad("bat", 5, "")    = "  bat"
 */
// 左邊補(bǔ)齊為5位字符串,結(jié)果:00123
String result = StringUtils.leftPad("123", 5, "0");
// 結(jié)果:123
String result = StringUtils.leftPad("123", 2, "0");

//-----------------------------
/**
 * StringUtils.rightPad(null, *, *)      = null
 * StringUtils.rightPad("", 3, "z")      = "zzz"
 * StringUtils.rightPad("bat", 3, "yz")  = "bat"
 * StringUtils.rightPad("bat", 5, "yz")  = "batyz"
 * StringUtils.rightPad("bat", 8, "yz")  = "batyzyzy"
 * StringUtils.rightPad("bat", 1, "yz")  = "bat"
 * StringUtils.rightPad("bat", -1, "yz") = "bat"
 * StringUtils.rightPad("bat", 5, null)  = "bat  "
 * StringUtils.rightPad("bat", 5, "")    = "bat  "
 */
// 右側(cè)補(bǔ)齊為5位字符串邢笙,結(jié)果:12300
String result = StringUtils.rightPad("123", 5, "0");
3.3.5 反轉(zhuǎn)字符串
// 結(jié)果:cba
String result = StringUtils.reverse("abc");
3.3.6 重復(fù)字符串
/**
 * StringUtils.repeat(null, 2) = null
 * StringUtils.repeat("", 0)   = ""
 * StringUtils.repeat("", 2)   = ""
 * StringUtils.repeat("a", 3)  = "aaa"
 * StringUtils.repeat("ab", 2) = "abab"
 * StringUtils.repeat("a", -2) = ""
*/
// 結(jié)果:00000
String result = StringUtils.repeat("0",5);
3.3.7 隨機(jī)字符串
//10位啸如,包含英文大小寫(xiě),如:MiLdFwsrDF
System.out.println(RandomStringUtils.randomAlphabetic(10));

//10位鸣剪,包含英文大小寫(xiě),和數(shù)字组底,如:QESP1Zjqjn
System.out.println(RandomStringUtils.randomAlphanumeric(10));

//10位,ASCII碼筐骇,如:Kv(f.1rC)*
System.out.println(RandomStringUtils.randomAscii(10));

//10位,指定文字江滨,如:ceabbaecec
System.out.println(RandomStringUtils.random(10, "abcde"));

//10位铛纬,數(shù)字,如:0025228642
System.out.println(RandomStringUtils.randomNumeric(10));

3.3 commons-text包

相關(guān)類(lèi):org.apache.commons.text.StringSubstitutor

3.1.1 替換字符串占位符
Map<String, String> valueMap = new HashMap<>();
valueMap.put("name", "張三");
valueMap.put("age", "18");
// 默認(rèn)替換占位符【${xxx}】唬滑,可調(diào)用構(gòu)造函數(shù)【new StringSubstitutor(valueMap)】
StringSubstitutor stringSubstitutor = new StringSubstitutor(valueMap, "${", "}");
// 替換結(jié)果:姓名:張三告唆,年齡:18。
String result = stringSubstitutor.replace("姓名:${name}晶密,年齡:${age}擒悬。");

//-------------------------
Map<String, Object> params = new HashMap<>();
params.put("jre-1.8", "java-version-1.8");
params.put("java.specification.version", "1.8");
StringSubstitutor stringSubstitutor = new StringSubstitutor(params);
// 支持變量的嵌套替換
stringSubstitutor.setEnableSubstitutionInVariables(true);
// 結(jié)果:java-version-1.8
String result = stringSubstitutor.replace("${jre-${java.specification.version}}");

4 集合相關(guān)

4.1 commons-collections4包

相關(guān)類(lèi):org.apache.commons.collections4.CollectionUtils

4.1.1 判斷集合是否為空
// 非線程安全
boolean result = CollectionUtils.isEmpty(list);
boolean result = CollectionUtils.isNotEmpty(list);
4.1.2 元素加到集合中
List<String> list = new ArrayList<String>(){{add("1");add("2");}};
// 如何集合被更改,返回true稻艰,否則返回false懂牧。list內(nèi)容變更為:1, 2, a, b
boolean result = CollectionUtils.addAll(list,"a","b");
// 集合追加到集合
boolean result = CollectionUtils.addAll(list1,list2);
4.1.3 反轉(zhuǎn)數(shù)組
String[] arr = new String[]{"1", "2", "3"};
// arr結(jié)果為:3,2,1
CollectionUtils.reverseArray(arr);
4.1.4 合并集合
// 返回結(jié)果:判斷集合是否變更
boolean result = CollectionUtils.addAll(targetList,sourceList);

5 轉(zhuǎn)碼

5.1 commons-codec包

相關(guān)類(lèi):

org.apache.commons.codec.digest.DigestUtils

5.1.1 MD5摘要
// 生成md5摘要(32位十六進(jìn)制),返回:e10adc3949ba59abbe56e057f20f883e
String md5Hex = DigestUtils.md5Hex("123456");

// 字節(jié)數(shù)組尊勿,生成md5摘要
// public static String md5Hex(final byte[] data);

// 輸入流僧凤,生成md5摘要(可用于生成文件的md5摘要)
// public static String md5Hex(final InputStream data) throws IOException;
5.1.2 SHA-1摘要
// 生成SHA-1摘要(十六進(jìn)制),返回:7c4a8d09ca3762af61e59520943dc26494f8941b
String sha1 = DigestUtils.sha1Hex("123456");

// 字節(jié)數(shù)組元扔,生成SHA-1摘要
// public static String sha1Hex(final byte[] data);

// 輸入流躯保,生成SHA-1摘要(可用于生成文件的SHA-1摘要)
// public static String sha1Hex(final InputStream data) throws IOException;

6 文件相關(guān)

6.1 commons-io包

相關(guān)類(lèi):

org.apache.commons.io.FileUtils

org.apache.commons.io.FilenameUtils

6.1 獲取文件路徑信息
// 獲取文件名(無(wú)后綴),返回:電話區(qū)域表
String baseName = FilenameUtils.getBaseName("D:\\config\\電話區(qū)域表.xlsx");

// 獲取文件名(包括后綴)澎语,返回:電話區(qū)域表.xlsx
String name = FilenameUtils.getName("D:\\config\\電話區(qū)域表.xlsx");

// 獲取后綴途事,返回:xlsx
String extension = FilenameUtils.getExtension("D:\\config\\電話區(qū)域表.xlsx");
6.2 字符串寫(xiě)入文件
// 寫(xiě)入數(shù)據(jù)
String data = "文本數(shù)據(jù)";
// 追加寫(xiě)入(默認(rèn)false)
boolean append = true;
// 將一個(gè)字符串寫(xiě)入一個(gè)文件(無(wú)換行)
FileUtils.writeStringToFile(new File("D:\\config\\test.txt"), data, Charset.forName("GBK"), append);
6.3 批量寫(xiě)入文件
// 集合內(nèi)容
List<String> list = new ArrayList<String>(){{add("aaa");add("bbb");add("ccc");}};
// 行分隔符(默認(rèn)null)
String lineEnding = null;
// 追加寫(xiě)入(默認(rèn)false)
boolean append = false;
// 字符集名稱(chēng)(默認(rèn)為null验懊,采用操作系統(tǒng)默認(rèn)值)
String charsetName = "GBK";
// 集合內(nèi)的每個(gè)元素,執(zhí)行toString()尸变,按行寫(xiě)入文件
FileUtils.writeLines(new File("D:\\config\\test.txt"), charsetName, list, lineEnding, append);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲁森,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子振惰,更是在濱河造成了極大的恐慌歌溉,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骑晶,死亡現(xiàn)場(chǎng)離奇詭異痛垛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)桶蛔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)匙头,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人仔雷,你說(shuō)我怎么就攤上這事蹂析。” “怎么了碟婆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵电抚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我竖共,道長(zhǎng)蝙叛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任公给,我火速辦了婚禮借帘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淌铐。我一直安慰自己肺然,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布腿准。 她就那樣靜靜地躺著际起,像睡著了一般。 火紅的嫁衣襯著肌膚如雪释涛。 梳的紋絲不亂的頭發(fā)上加叁,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音唇撬,去河邊找鬼它匕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窖认,可吹牛的內(nèi)容都是我干的豫柬。 我是一名探鬼主播告希,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼烧给!你這毒婦竟也來(lái)了燕偶?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤础嫡,失蹤者是張志新(化名)和其女友劉穎指么,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體榴鼎,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伯诬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巫财。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盗似。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖平项,靈堂內(nèi)的尸體忽然破棺而出赫舒,到底是詐尸還是另有隱情,我是刑警寧澤闽瓢,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布接癌,位于F島的核電站,受9級(jí)特大地震影響鸳粉,放射性物質(zhì)發(fā)生泄漏扔涧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一届谈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弯汰,春花似錦艰山、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鸽嫂,卻和暖如春纵装,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背据某。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工橡娄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人癣籽。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓挽唉,卻偏偏與公主長(zhǎng)得像滤祖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓶籽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容