1. 程式人生 > >Spring中的各種Utils(二):StringUtils詳解

Spring中的各種Utils(二):StringUtils詳解

本節我們重新來看看我們熟悉的StringUtils。其實這裡面的方法很多。

首先,這個工具類裡面的所有方法,都是針對字串常見操作,其次,裡面有不少方法,即可以針對String,也可以使用CharSequence;

判斷類

屬於該類別的方法都是在對字串進行一些判定操作:

    //判斷類:
    // boolean isEmpty(Object str):字串是否為空或者空字串:""
    // boolean hasLength(CharSequence str):字串是否為空,或者長度為0
    // boolean hasText(String str):字串是否有內容(不為空,且不全為空格)
    assertFalse(StringUtils.hasText("   "));
    // boolean containsWhitespace(String str):字串是否包含空格
    assertTrue(StringUtils.containsWhitespace("a b"));

字串頭尾操作

屬於該類別的方法,都是對字串前,或者字串後的內容進行判定或者操作;

//字串頭尾操作
// String trimWhitespace(String str):去掉字串前後的空格
assertEquals("abc", StringUtils.trimWhitespace(" abc "));
// String trimAllWhitespace(String str):去掉字串中所有的空格
assertEquals("abc", StringUtils.trimAllWhitespace(" a b c "));
// String trimLeadingWhitespace(String str):去掉字串開頭的空格
// String trimTrailingWhitespace(String str):去掉字串結束的空格

// String trimLeadingCharacter(String str, char leadingCharacter):去掉字串開頭的指定字元;
// String trimTrailingCharacter(String str, char trailingCharacter):去掉字串結尾的指定字元;

// boolean startsWithIgnoreCase(String str, String prefix):
// 判斷字串是否以指定字串開頭,忽略大小寫
assertTrue(StringUtils.startsWithIgnoreCase("abcd", "AB"));
// boolean endsWithIgnoreCase(String str, String suffix):
// 判斷字串是否以指定字串結尾,忽略大小寫

檔案路徑名稱相關操作

檔案路徑名稱相關操作,是針對檔名,檔案路徑,檔案字尾等常見檔案操作中需要用到的方法進行封裝;

// String unqualify(String qualifiedName):
// 得到以.分割的最後一個值,可以非常方便的獲取類似類名或者檔案字尾
assertEquals("java", StringUtils.unqualify("cn.wolfcode.java"));
assertEquals("java", StringUtils.unqualify("cn/wolfcode/Hello.java"));

// String unqualify(String qualifiedName, char separator):
// 得到以給定字元分割的最後一個值,可以非常方便的獲取類似檔名
assertEquals("Hello.java", StringUtils
        .unqualify("cn/wolfcode/Hello.java", File.separatorChar));

// String capitalize(String str):首字母大寫
assertEquals("Wolfcode", StringUtils.capitalize("wolfcode"));

// String uncapitalize(String str):取消首字母大寫
assertEquals("java", StringUtils.uncapitalize("Java"));

// String getFilename(String path):獲取檔名,就不需要再使用FilenameUtils
assertEquals("myfile.txt",
        StringUtils.getFilename("mypath/myfile.txt"));

// String getFilenameExtension(String path):獲取檔案字尾名
assertEquals("txt",
        StringUtils.getFilenameExtension("mypath/myfile.txt"));

// String stripFilenameExtension(String path):擷取掉檔案路徑字尾
assertEquals("mypath/myfile",
        StringUtils.stripFilenameExtension("mypath/myfile.txt"));

// String applyRelativePath(String path, String relativePath):
// 找到給定的檔案,和另一個相對路徑的檔案,返回第二個檔案的全路徑
// 列印:d:/java/wolfcode/other/Some.java
System.out.println(StringUtils.applyRelativePath(
        "d:/java/wolfcode/Test.java", "other/Some.java"));
// 但是不支援重新定位絕對路徑和上級目錄等複雜一些的相對路徑寫法:
// 仍然列印:d:/java/wolfcode/../other/Some.java
System.out.println(StringUtils.applyRelativePath(
        "d:/java/wolfcode/Test.java", "../other/Some.java"));

// String cleanPath(String path):
// 清理檔案路徑,這個方法配合applyRelativePath就可以計算一些簡單的相對路徑了
// 列印:d:/java/other/Some.java
System.out.println(
        StringUtils.cleanPath("d:/java/wolfcode/../other/Some.java"));
// 需求:獲取d:/java/wolfcode/Test.java相對路徑為../../other/Some.java的檔案全路徑:
// 列印:d:/other/Some.java
System.out.println(StringUtils.cleanPath(StringUtils.applyRelativePath(
        "d:/java/wolfcode/Test.java", "../../other/Some.java")));

// boolean pathEquals(String path1, String path2):
// 判斷兩個檔案路徑是否相同,會先執行cleanPath之後再比較
assertTrue(StringUtils.pathEquals("d:/wolfcode.txt",
        "d:/somefile/../wolfcode.txt"));

字串和子串的操作

該組方法中主要是提供了字串和字串子串的操作,比如子串的匹配,子串的替換;子串的刪除等等操作;

// boolean substringMatch(CharSequence str, int index, CharSequence
// substring):判斷從指定索引開始,是否匹配子字串
assertTrue(StringUtils.substringMatch("aabbccdd", 1, "abb"));

// int countOccurrencesOf(String str, String sub):判斷子字串在字串中出現的次數
assertEquals(4, StringUtils.countOccurrencesOf("ababaabab", "ab"));

// String replace(String inString, String oldPattern, String
// newPattern):在字串中使用子字串替換
assertEquals("cdcdacdcd", StringUtils.replace("ababaabab", "ab", "cd"));

// String delete(String inString, String pattern):刪除所有匹配的子字串;
assertEquals("a", StringUtils.delete("ababaabab", "ab"));

// String deleteAny(String inString, String charsToDelete):刪除子字串中任意出現的字元
assertEquals("", StringUtils.deleteAny("ababaabab", "bar"));

// String quote(String str) :在字串前後增加單引號,比較適合在日誌時候使用;
assertEquals("'hello'", StringUtils.quote("hello"));

本地化相關

和Locale相關的一些字串操作;

// Locale parseLocaleString(String localeString):
// 從本地化字串中解析出本地化資訊,相當於Locale.toString()的逆向方法
assertEquals(Locale.CHINA, StringUtils.parseLocaleString("zh_CN"));

// String toLanguageTag(Locale locale):把Locale轉化成HTTP中Accept-Language能接受的本地化標準;
// 比如標準的本地化字串為:zh_CN,更改為zh-CN
System.out.println(StringUtils
        .toLanguageTag(StringUtils.parseLocaleString("zh_CN")));

字串和Properties

把字串和Properties物件之間的相互轉化抽取出的一些常用方法;

//Properties splitArrayElementsIntoProperties(String[] array, String delimiter):
// 把字串陣列中的每一個字串按照給定的分隔符裝配到一個Properties中
String[] strs=new String[]{"key:value","key2:中文"};
Properties ps=StringUtils.splitArrayElementsIntoProperties(strs, ":");
//列印輸出:{key=value, key2=中文}
System.out.println(ps);

//Properties splitArrayElementsIntoProperties(String[] array, String delimiter, String charsToDelete)
//把字串陣列中的每一個字串按照給定的分隔符裝配到一個Properties中,並刪除指定字串,比如括號之類的;

字串和陣列之間的基本操作

該組方法主要是完成字串和字串陣列之間的基本操作,比如追加,刪除,排序等;

// String[] addStringToArray(String[] array, String str):把一個字串新增到一個字串陣列中
// 列印:[a, b, c, d]
System.out.println(Arrays.toString(StringUtils
        .addStringToArray(new String[] { "a", "b", "c" }, "d")));

// String[] concatenateStringArrays(String[] array1, String[]array2):連線兩個字串陣列
//列印:[a, b, c, a, b, c]
System.out.println(Arrays.toString(StringUtils.concatenateStringArrays(
        new String[] { "a", "b", "c" },
        new String[] { "a", "b", "c","d" })));

//String[] mergeStringArrays(String[] array1, String[] array2):連線兩個字串陣列,去掉重複元素
//列印:[a, b, c, d]
System.out.println(Arrays.toString(StringUtils.mergeStringArrays(
        new String[] { "a", "b", "c" },
        new String[] { "a", "b", "c","d" })));

//String[] sortStringArray(String[] array):字串陣列排序
//列印:[a, b, c, d]
System.out.println(Arrays.toString(StringUtils.sortStringArray(new String[]{"d","c","b","a"})));

//String[] toStringArray(Collection<String> collection):把字串集合變成字串陣列
//String[] toStringArray(Enumeration<String> enumeration):把字串列舉型別變成字串陣列
//String[] trimArrayElements(String[] array):把字串陣列中所有字串執行trim功能;
//String[] removeDuplicateStrings(String[] array):去掉給定字串陣列中重複的元素,能保持原順序;

字串和陣列的更多方法

在該組方法中,提供了更多字串和陣列的方法,主要涉及到字串陣列的合併,字串的按規則拆分,字串和集合之間的相互轉化等操作;

//String[] split(String toSplit, String delimiter):按照指定字串分割字串;
assertArrayEquals(new String[]{"wolfcode","cn"}, StringUtils.split("wolfcode.cn", "."));
//只分割第一次,列印:[www, wolfcode.cn]
System.out.println(Arrays.toString(StringUtils.split("www.wolfcode.cn", ".")));


//String[] tokenizeToStringArray(String str, String delimiters)
//會對每一個元素執行trim操作,並去掉空字串
//使用的是StringTokenizer完成,
//列印[b, c, d]
System.out.println(Arrays.toString(StringUtils.tokenizeToStringArray("aa,ba,ca,da", "a,")));
//String[] tokenizeToStringArray(String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens)
//後面兩個引數在限定是否對每一個元素執行trim操作,是否去掉空字串

//String[] delimitedListToStringArray(String str, String delimiter):分割字串,會把delimiter作為整體分隔符
//列印:[a, b, c, da]
System.out.println(Arrays.toString(StringUtils.delimitedListToStringArray("aa,ba,ca,da", "a,")));
//String[] delimitedListToStringArray(String str, String delimiter, String charsToDelete)
//分割字串,會把delimiter作為整體分隔符,增加一個要從分割字串中刪除的字元;

//String[] commaDelimitedListToStringArray(String str):使用逗號分割字串
//是delimitedListToStringArray(str, ",")的簡單方法

//Set<String> commaDelimitedListToSet(String str):使用逗號分割字串,並放到set中去重
//使用LinkedHashSet;

//String collectionToDelimitedString(Collection<?> coll, String delim, String prefix, String suffix)
//將一個集合中的元素,使用字首,字尾,分隔符拼裝一個字串,字首後後綴是針對每一個字串的
String[] arrs=new String[]{"aa","bb","cc","dd"};
assertEquals("{aa},{bb},{cc},{dd}", StringUtils.collectionToDelimitedString(Arrays.asList(arrs),",","{","}"));

//String collectionToDelimitedString(Collection<?> coll, String delim):集合變成指定字串連線的字串;
//是collectionToDelimitedString(coll, delim, "", "")的簡寫;
//String collectionToCommaDelimitedString(Collection<?> coll):集合變成逗號連線的字串;
//是collectionToDelimitedString(coll, ",");的簡寫;

//String arrayToDelimitedString(Object[] arr, String delim):陣列使用指定字串連線;
//String arrayToCommaDelimitedString(Object[] arr):使用逗號連線陣列,拼成字串;

小結

StringUtils類中的方法其實真的還是很多,可能平時我們用的比較多的還是一些普通的方法,其實類似檔案路徑,檔名等相關操作,以前還會專門引入common-io的FilenameUtils等額外的工具類,原來在StringUtils中都有,而且根據其設計的這些方法,我們也能大概的猜出一些方法在Spring中哪些地方可能有用;最後,其中有些方法,還是非常常見的面試題,比如替換字串,查詢子串個數等,有興趣也可以看看Spring的具體實現。


相關推薦

Spring各種Utils:StringUtils

本節我們重新來看看我們熟悉的StringUtils。其實這裡面的方法很多。首先,這個工具類裡面的所有方法,都是針對字串常見操作,其次,裡面有不少方法,即可以針對String,也可以使用CharSequence;判斷類屬於該類別的方法都是在對字串進行一些判定操作: //判

Spring-data-jpa 筆記 Repository

方法參數 count 有一個 long 合規 page byname mirror id屬性    基礎的 Repository 提供了最基本的數據訪問功能,其幾個子接口則擴展了一些功能。它們的繼承關系如下: Repository: 是 spring Dat

Spring-bootWebMvcConfigurerAdapter

定義 WebMvcConfigurationAdapter是一個配置類,該配置類主要利用@Bean方式來配置,該配置類裡的配置主要功能是針對Http請求作統一處理。我們想要使用這樣的配置方式,需要自定義一個類取繼承這個配置類。 具體的API方法功能 以下的API中WebCon

spring事務原始碼

系列目錄 spring事務詳解(三)使用樣例 spring事務詳解(四)測試驗證 spring事務詳解(五)總結提高 一、引子 在Spring中,事務有兩種實現方式: 程式設計式事務管理: 程式設計式事務管理使用TransactionTemplate可實現更細粒度的事務控制。 申明

Spring Boot 啟動 配置

ner sys 記錄 標準 () 系統屬性 code 不同 .profile Spring Boot 啟動(二) 配置詳解 Spring 系列目錄(https://www.cnblogs.com/binarylei/p/10198698.html) Spring Boot

深入淺出javaEE系列---servlet

       工作這麼久了,一直在開發web專案,servlet也是一直在用,但是對servlet核心的理解一直沒時間去做總結,這篇博文,深入淺出介紹了servlet的前前後後,希望給在java學習路上的各位同胞一個借鑑。 一、瞭解Servlet的概念

Spark2.0學習--------RDD

新增針對scala檔案的編譯外掛 ------------------------------ <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:

NodeJS的事件EventEmitter API附原始碼

EventEmitter 簡介 EventEmitter 是 NodeJS 的核心模組 events 中的類,用於對 NodeJS 中的事件進行統一管理,用 events 特定的 API 對事件進行新增、觸發和移除等等,核心方法的模式類似於釋出訂閱。 實現 EventEm

Java NIO學習SelectionKey

書接上文 上一篇部落格中的結尾講到將Channel註冊在某個Selector的管轄範圍之下: channel.register(selector, SelectionKey.OP_ACCEPT); 由這個register()方法的第二個引數Select

Caffe框架的理解AlexNet

引言 在2012年的時候,Geoffrey和他學生Alex為了迴應質疑者,在ImageNet的競賽中利用AlexNet一舉重新整理image classification的記錄,奠定了deep learning 在計算機視覺中的地位。這裡將利用對這一模型的分析

深入理解HTTP協議——協議

1.HTTP/1.0和HTTP/1.1的比較 RFC 1945定義了HTTP/1.0版本,RFC 2616定義了HTTP/1.1版本。 1.1建立連線方面 HTTP/1.0 每次請求都需要建立新的TCP連線,連線不能複用。HTTP/1.1 新的請求可以在上次請求建立

訊息中介軟體Rabbitmq-使用

https://blog.csdn.net/Dante_003/article/details/79377908Rabbitmq 是基於amqp(高階訊息佇列協議)實現的佇列技術,在他之上可以完成多種型別的訊息轉發模型。 下面列舉一些常用的訊息轉發場景,在rabbitmq中是

Azure Terraform語法

一,引言   上篇文章開始,我們簡單介紹了以下通過基礎設施管理工具----- Terraform,通過它來統一管理複雜的雲基礎設施資源。作為入門演示,使用Terraform 部署Azure 資源組的方式直觀的感受到iac 工具帶來的強大便利。接下來,今天介紹 Terraform 語法詳解,從程式碼的角度來理解

Spring各種Utils:AopProxyUtils

原創文章,轉載請註明出處本節介紹AopProxyUtils,這個工具類方法本身很少,但是涉及到很多AOP相關重要介面,所以本節主要會對涉及到的介面進行初步的介紹;Class<?> ultimateTargetClass(Object candidate)獲取一個代

總結Spring框架擴充套件點bean生命週期的擴充套件點持續更新...

面向業務開發的時候,程式設計師需要明白業務的邏輯,並設計程式碼結構。而在進行中介軟體開發的時候,則需要明白框架的邏輯,進行開發。 所以要開發提供給spring的中介軟體,需要知道spring中有哪些擴充套件點,好在對應的地方插入我們的功能。 1. Spring容器初始化b

Spring源碼解讀】bean標簽的屬性你可能還不夠了的 abstract 屬性和 parent 屬性

() 語義 valueof 更多 vat assert getheight 它的 src abstract 屬性說明 abstract 在java的語義裏是代表抽象的意思,用來說明被修飾的類是抽象類。在Spring中bean標簽裏的 abstract 的含義其實也差不多,表

A1—淺談JavaScript的原型

js原型是什麽?想要了解這個問題,我們就必須要知道對象。對象根據w3cschool上的介紹:對象只是帶有屬性和方法的特殊數據類型。我們知道,數組是用來描述數據的。其實呢,對象也是用來描述數據的。只不過有一點點的區別,那就是數組的下標只能是數字。所以,數組最好只用來裝同樣意義的內容。比如說[1,2,3,4,5]

Spring Boot 學習筆記

imp family framework ima pri spa cal bin ges 新建Srping Boot 項目 以下是項目結構 由於Srping Boot內置Tomcat,所以不需要配置Tomcat就可以直接運行。 HelloWorldAppli

spring 內部工作機制

出了 流水線 tor 應用程序 java反射機制 post 技術 process 加載 本章節講Spring容器從加載配置文件到創建出一個完整Bean的作業流程及參與的角色。 Spring 啟動時讀取應用程序提供的Bean配置信息,並在Spring容器中生成一份相應

Spring Boot參考教程SpringBoot特性

provide 初始化 spa using 一個 ora https ann war 2. Spring Boot特性 1. Starter pom(起步依賴) Spring提供了一系列的starterpom來簡化Maven的依賴加載,具體可參考官方文檔13.5 Star