Spring中的各种Utils(二):StringUtils详解(转载)

原文出处:https://blog.csdn.net/wolfcode_cn/article/details/80660584

本节我们重新来看看我们熟悉的StringUtils。其实这里面的方法很多。

首先,这个工具类里面的所有方法,都是针对字符串常见操作,其次,里面有不少方法,即可以针对String,也可以使用CharSequence;

判断类

属于该类别的方法都是在对字符串进行一些判定操作:

  1.  //判断类:
  2.  // boolean isEmpty(Object str):字符串是否为空或者空字符串:""
  3.  // boolean hasLength(CharSequence str):字符串是否为空,或者长度为0
  4.  // boolean hasText(String str):字符串是否有内容(不为空,且不全为空格)
  5.  assertFalse(StringUtils.hasText(" "));
  6.  // boolean containsWhitespace(String str):字符串是否包含空格
  7.  assertTrue(StringUtils.containsWhitespace("a b"));

字符串头尾操作

属于该类别的方法,都是对字符串前,或者字符串后的内容进行判定或者操作;

  1.  //字符串头尾操作
  2.  // String trimWhitespace(String str):去掉字符串前后的空格
  3.  assertEquals("abc", StringUtils.trimWhitespace(" abc "));
  4.  // String trimAllWhitespace(String str):去掉字符串中所有的空格
  5.  assertEquals("abc", StringUtils.trimAllWhitespace(" a b c "));
  6.  // String trimLeadingWhitespace(String str):去掉字符串开头的空格
  7.  // String trimTrailingWhitespace(String str):去掉字符串结束的空格
  8.   
  9.  // String trimLeadingCharacter(String str, char leadingCharacter):去掉字符串开头的指定字符;
  10.  // String trimTrailingCharacter(String str, char trailingCharacter):去掉字符串结尾的指定字符;
  11.    
  12. // boolean startsWithIgnoreCase(String str, String prefix):
  13.  // 判断字符串是否以指定字符串开头,忽略大小写
  14.  assertTrue(StringUtils.startsWithIgnoreCase("abcd", "AB"));
  15.  // boolean endsWithIgnoreCase(String str, String suffix):
  16.  // 判断字符串是否以指定字符串结尾,忽略大小写

文件路径名称相关操作

文件路径名称相关操作,是针对文件名,文件路径,文件后缀等常见文件操作中需要用到的方法进行封装;

  1.  // String unqualify(String qualifiedName):
  2.  // 得到以.分割的最后一个值,可以非常方便的获取类似类名或者文件后缀
  3.  assertEquals("java", StringUtils.unqualify("cn.wolfcode.java"));
  4.  assertEquals("java", StringUtils.unqualify("cn/wolfcode/Hello.java"));
  5.  
  6.  // String unqualify(String qualifiedName, char separator):
  7.  // 得到以给定字符分割的最后一个值,可以非常方便的获取类似文件名
  8.  assertEquals("Hello.java", StringUtils
  9.  .unqualify("cn/wolfcode/Hello.java", File.separatorChar));
  10.   
  11.  // String capitalize(String str):首字母大写
  12.  assertEquals("Wolfcode", StringUtils.capitalize("wolfcode"));
  13.  
  14.  // String uncapitalize(String str):取消首字母大写
  15.  assertEquals("java", StringUtils.uncapitalize("Java"));
  16.  
  17.  // String getFilename(String path):获取文件名,就不需要再使用FilenameUtils
  18.  assertEquals("myfile.txt",
  19.  StringUtils.getFilename("mypath/myfile.txt"));
  20.   
  21.  // String getFilenameExtension(String path):获取文件后缀名
  22.  assertEquals("txt",
  23.  StringUtils.getFilenameExtension("mypath/myfile.txt"));
  24.  
  25.  // String stripFilenameExtension(String path):截取掉文件路径后缀
  26.  assertEquals("mypath/myfile",
  27.  StringUtils.stripFilenameExtension("mypath/myfile.txt"));
  28.  
  29.  // String applyRelativePath(String path, String relativePath):
  30.  // 找到给定的文件,和另一个相对路径的文件,返回第二个文件的全路径
  31.  // 打印:d:/java/wolfcode/other/Some.java
  32.  System.out.println(StringUtils.applyRelativePath(
  33.  "d:/java/wolfcode/Test.java", "other/Some.java"));
  34.  // 但是不支持重新定位绝对路径和上级目录等复杂一些的相对路径写法:
  35.  // 仍然打印:d:/java/wolfcode/../other/Some.java
  36.  System.out.println(StringUtils.applyRelativePath(
  37.  "d:/java/wolfcode/Test.java", "../other/Some.java"));
  38.  
  39.  // String cleanPath(String path):
  40.  // 清理文件路径,这个方法配合applyRelativePath就可以计算一些简单的相对路径了
  41.  // 打印:d:/java/other/Some.java
  42.  System.out.println(
  43.  StringUtils.cleanPath("d:/java/wolfcode/../other/Some.java"));
  44.  // 需求:获取d:/java/wolfcode/Test.java相对路径为../../other/Some.java的文件全路径:
  45.  // 打印:d:/other/Some.java
  46.  System.out.println(StringUtils.cleanPath(StringUtils.applyRelativePath(
  47.  "d:/java/wolfcode/Test.java", "../../other/Some.java")));
  48.  
  49.  // boolean pathEquals(String path1, String path2):
  50.  // 判断两个文件路径是否相同,会先执行cleanPath之后再比较
  51.  assertTrue(StringUtils.pathEquals("d:/wolfcode.txt",
  52.  "d:/somefile/../wolfcode.txt"));

字符串和子串的操作

该组方法中主要是提供了字符串和字符串子串的操作,比如子串的匹配,子串的替换;子串的删除等等操作;

  1.  // boolean substringMatch(CharSequence str, int index, CharSequence
  2.  // substring):判断从指定索引开始,是否匹配子字符串
  3.  assertTrue(StringUtils.substringMatch("aabbccdd", 1, "abb"));
  4.   
  5.  // int countOccurrencesOf(String str, String sub):判断子字符串在字符串中出现的次数
  6.  assertEquals(4, StringUtils.countOccurrencesOf("ababaabab", "ab"));
  7.   
  8.  // String replace(String inString, String oldPattern, String
  9.  // newPattern):在字符串中使用子字符串替换
  10.  assertEquals("cdcdacdcd", StringUtils.replace("ababaabab", "ab", "cd"));
  11.  
  12.  // String delete(String inString, String pattern):删除所有匹配的子字符串;
  13.  assertEquals("a", StringUtils.delete("ababaabab", "ab"));
  14.  
  15.  // String deleteAny(String inString, String charsToDelete):删除子字符串中任意出现的字符
  16.  assertEquals("", StringUtils.deleteAny("ababaabab", "bar"));
  17.  
  18.  // String quote(String str) :在字符串前后增加单引号,比较适合在日志时候使用;
  19.  assertEquals("'hello'", StringUtils.quote("hello"));

本地化相关

和Locale相关的一些字符串操作;

  1.  // Locale parseLocaleString(String localeString):
  2.  // 从本地化字符串中解析出本地化信息,相当于Locale.toString()的逆向方法
  3.  assertEquals(Locale.CHINA, StringUtils.parseLocaleString("zh_CN"));
  4.  
  5.  // String toLanguageTag(Locale locale):把Locale转化成HTTP中Accept-Language能接受的本地化标准;
  6.  // 比如标准的本地化字符串为:zh_CN,更改为zh-CN
  7.  System.out.println(StringUtils
  8.  .toLanguageTag(StringUtils.parseLocaleString("zh_CN")));

字符串和Properties

把字符串和Properties对象之间的相互转化抽取出的一些常用方法;

  1.  //Properties splitArrayElementsIntoProperties(String[] array, String delimiter):
  2.  // 把字符串数组中的每一个字符串按照给定的分隔符装配到一个Properties中
  3.  String[] strs=new String[]{"key:value","key2:中文"};
  4.  Properties ps=StringUtils.splitArrayElementsIntoProperties(strs, ":");
  5.  //打印输出:{key=value, key2=中文}
  6.  System.out.println(ps);
  7.  
  8.  //Properties splitArrayElementsIntoProperties(String[] array, String delimiter, String charsToDelete)
  9.  //把字符串数组中的每一个字符串按照给定的分隔符装配到一个Properties中,并删除指定字符串,比如括号之类的;

字符串和数组之间的基本操作

该组方法主要是完成字符串和字符串数组之间的基本操作,比如追加,删除,排序等;

  1.  // String[] addStringToArray(String[] array, String str):把一个字符串添加到一个字符串数组中
  2.  // 打印:[a, b, c, d]
  3.  System.out.println(Arrays.toString(StringUtils
  4.  .addStringToArray(new String[] { "a", "b", "c" }, "d")));
  5.  
  6.  // String[] concatenateStringArrays(String[] array1, String[]array2):连接两个字符串数组
  7.  //打印:[a, b, c, a, b, c]
  8.  System.out.println(Arrays.toString(StringUtils.concatenateStringArrays(
  9.  new String[] { "a", "b", "c" },
  10.  new String[] { "a", "b", "c","d" })));
  11.   
  12.  //String[] mergeStringArrays(String[] array1, String[] array2):连接两个字符串数组,去掉重复元素
  13.  //打印:[a, b, c, d]
  14.  System.out.println(Arrays.toString(StringUtils.mergeStringArrays(
  15.  new String[] { "a", "b", "c" },
  16.  new String[] { "a", "b", "c","d" })));
  17.  
  18.  //String[] sortStringArray(String[] array):字符串数组排序
  19.  //打印:[a, b, c, d]
  20.  System.out.println(Arrays.toString(StringUtils.sortStringArray(new String[]{"d","c","b","a"})));
  21.  
  22.  //String[] toStringArray(Collection<String> collection):把字符串集合变成字符串数组
  23.  //String[] toStringArray(Enumeration<String> enumeration):把字符串枚举类型变成字符串数组
  24.  //String[] trimArrayElements(String[] array):把字符串数组中所有字符串执行trim功能;
  25.  //String[] removeDuplicateStrings(String[] array):去掉给定字符串数组中重复的元素,能保持原顺序;

字符串和数组的更多方法

在该组方法中,提供了更多字符串和数组的方法,主要涉及到字符串数组的合并,字符串的按规则拆分,字符串和集合之间的相互转化等操作;

  1.  //String[] split(String toSplit, String delimiter):按照指定字符串分割字符串;
  2.  assertArrayEquals(new String[]{"wolfcode","cn"}, StringUtils.split("wolfcode.cn", "."));
  3.  //只分割第一次,打印:[www, wolfcode.cn]
  4.  System.out.println(Arrays.toString(StringUtils.split("www.wolfcode.cn", ".")));
  5.  
  6.  
  7.  //String[] tokenizeToStringArray(String str, String delimiters)
  8.  //会对每一个元素执行trim操作,并去掉空字符串
  9.  //使用的是StringTokenizer完成,
  10.  //打印[b, c, d]
  11.  System.out.println(Arrays.toString(StringUtils.tokenizeToStringArray("aa,ba,ca,da", "a,")));
  12.  //String[] tokenizeToStringArray(String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens)
  13.  //后面两个参数在限定是否对每一个元素执行trim操作,是否去掉空字符串
  14.   
  15.  //String[] delimitedListToStringArray(String str, String delimiter):分割字符串,会把delimiter作为整体分隔符
  16.  //打印:[a, b, c, da]
  17.  System.out.println(Arrays.toString(StringUtils.delimitedListToStringArray("aa,ba,ca,da", "a,")));
  18.  //String[] delimitedListToStringArray(String str, String delimiter, String charsToDelete)
  19.  //分割字符串,会把delimiter作为整体分隔符,增加一个要从分割字符串中删除的字符;
  20.  
  21.  //String[] commaDelimitedListToStringArray(String str):使用逗号分割字符串
  22.  //是delimitedListToStringArray(str, ",")的简单方法
  23.  
  24.  //Set<String> commaDelimitedListToSet(String str):使用逗号分割字符串,并放到set中去重
  25.  //使用LinkedHashSet;
  26.  
  27.  //String collectionToDelimitedString(Collection<?> coll, String delim, String prefix, String suffix)
  28.  //将一个集合中的元素,使用前缀,后缀,分隔符拼装一个字符串,前缀后后缀是针对每一个字符串的
  29.  String[] arrs=new String[]{"aa","bb","cc","dd"};
  30.  assertEquals("{aa},{bb},{cc},{dd}", StringUtils.collectionToDelimitedString(Arrays.asList(arrs),",","{","}"));
  31.  
  32.  //String collectionToDelimitedString(Collection<?> coll, String delim):集合变成指定字符串连接的字符串;
  33.  //是collectionToDelimitedString(coll, delim, "", "")的简写;
  34.  //String collectionToCommaDelimitedString(Collection<?> coll):集合变成逗号连接的字符串;
  35.  //是collectionToDelimitedString(coll, ",");的简写;
  36.  
  37.  //String arrayToDelimitedString(Object[] arr, String delim):数组使用指定字符串连接;
  38.  //String arrayToCommaDelimitedString(Object[] arr):使用逗号连接数组,拼成字符串;

小结

StringUtils类中的方法其实真的还是很多,可能平时我们用的比较多的还是一些普通的方法,其实类似文件路径,文件名等相关操作,以前还会专门引入common-io的FilenameUtils等额外的工具类,原来在StringUtils中都有,而且根据其设计的这些方法,我们也能大概的猜出一些方法在Spring中哪些地方可能有用;最后,其中有些方法,还是非常常见的面试题,比如替换字符串,查询子串个数等,有兴趣也可以看看Spring的具体实现。

posted @ 2018-07-14 17:40  青青子衿J  阅读(4233)  评论(0)    收藏  举报