apache.commons工具类总结

蒋畅
2023-12-01

前言

apache.commons ,springutil 中有很多现成的工具可以使用了,没必要重复造轮子,本文章主要是说一下有哪些比较常用的工具可以使用。

引用包说明

本文引用的所有包如下

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>
<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
</dependency>
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.3</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.6.RELEASE</version>
</dependency>

常用工具类介绍

下面每个块的工具都是按我的使用频率排序的。

字符串处理

import org.apache.commons.lang3.StringUtils;
boolean StringUtils.isBlank(str);			// " " 为 true
boolean StringUtils.isEmpty(str);			// " " 为 false
boolean StringUtils.isNotBlank(str);
boolean StringUtils.isNotEmpty(str);
String[] StringUtils.split(str,char/String,max);//切割字符串,使用给定字符 ;  max 主要是用来处理空内容的
String StringUtils.capitalize(str);			//首字母大写
String StringUtils.uncapitalize(str);		//首字母小写
boolean StringUtils.isNumeric(str);
boolean StringUtils.isNumericSpace(str);	// "" 为true "12 3" 为 true
String StringUtils.join(array/Iterable,chat/String);	// 类似于 js 的 join ,使用给定字符拼接数组或集合中的元素
String StringUtils.leftPad(str,size,padChar);		//给左边拼接固定长度的字符
String StringUtils.rightPad(str,size,padChar);		//右边拼接固定长度的字符

格式化信息

import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DurationFormatUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
DateFormatUtils.format(Date/Calendar/long,pattern);
DateFormatUtils.ISO_DATE_FORMAT.format(Date/Calendar/long);		// yyyy-MM-dd
DateFormatUtils.ISO_TIME_NO_T_FORMAT.format(Date/Calendar/long);// HH:mm:ss
DurationFormatUtils.formatDuration(long,format);		//格式化毫秒值为指定格式
// 用于实体类 param,po,dto,vo
@Override
public String toString() {
     return ToStringBuilder.reflectionToString(this,ToStringStyle.SHORT_PREFIX_STYLE);
}

集合和数组的处理

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.collections.CollectionUtils;
boolean ArrayUtils.isEmpty(Array);
boolean ArrayUtils.isNotEmpty(Array);
boolean CollectionUtils.isEmpty(Collection);
boolean CollectionUtils.isNotEmpty(Collection);
Collection CollectionUtils.union(a,b);			//并集
Collection CollectionUtils.intersection(a,b);	//交集
Collection CollectionUtils.disjunction(a,b);	//补集
Collection CollectionUtils.subtract(a,b);		//差集

日期处理

import org.apache.commons.lang3.time.DateUtils;
Date DateUtils.parseDate(str,parsePatterns);
boolean DateUtils.isSameDay(Date,Date);			//判断两个日期是否是同一天
Date DateUtils.truncate(Date,field);			//日期截取,只取指定日期字段的值
Date DateUtils.round(Date,field);				// 日期四舍五入,和 truncate 的区别是 如果用 YEAR 当前时间是 2019-08-18 truncate 的值还是 2019 ,但 round 会得到 2020 
Date DateUtils.addDays(Date,amount);			//增加一天,这个不会修改原来的日期值
还有 addYears,addMonths,addWeeks,addHours,addMinutes,addSeconds,addMilliseconds
Date DateUtils.setDays(Date,amount);			//设置为本月的第几天
还有 setYears,setMonths,setHours,setMinutes,setSeconds,setMilliseconds
/*
计算已过去的天数,从哪儿开始算呢,根据第2个参数fragment来确定,
如现在是2014-10-23 13:27:00,那么
DateUtils.getFragmentInDays(new Date(), Calendar.MONTH)返回23,表示从当月起已经过去23天了,
DateUtils.getFragmentInDays(new Date(), Calendar.YEAR)返回296,表示从当年起已经过去296天了,
DateUtils.getFragmentInHours(new Date(), Calendar.DATE)返回13,表示从今天起已经过去13个小时了
*/
long DateUtils.getFragmentInDays(Date,fragment);	//计算已经过去的天数

数字的一些处理

import org.apache.commons.lang3.math.NumberUtils;
int NumberUtils.toInt(String);
还有 toLong,toDouble,toFloat,toShort 等
boolean NumberUtils.isDigits(String);		//判断是否全由数字组成 "" 为 false
boolean NumberUtils.isNumber(String);		// 支持 0x 类的表达形式

增强反射处理

import org.apache.commons.lang3.ClassUtils;
import org.apache.commons.lang3.reflect.MethodUtils;
import org.springframework.cglib.core.ReflectUtils;
import org.springframework.util.ReflectionUtils;
Class<?> ClassUtils.getClass(className);
boolean ClassUtils.isInnerClass(Class<?>);			//是否是内部类
boolean ClassUtils.isPrimitiveOrWrapper(Class<?>);	//判断是否是原始类型或原始类型的包装类
List<Method> MethodUtils.getMethodsListWithAnnotation( Class<?>, Class<? extends Annotation>);
Method ReflectionUtils.findMethod(Class<?> clazz,methodName, Class<?>...);
PropertyDescriptor[] ReflectUtils.getBeanGetters(Class type);
Object MethodUtils.invokeMethod(object,methodName,args[],values[]);	//调用方法


IO 流,文件相关方法


import org.apache.commons.io.IOUtils;

import org.apache.commons.io.FileUtils;

import org.apache.commons.io.FilenameUtils;

String IOUtils.toString(InputStream,encoding);			//文本文件流读出字符串

List<String> IOUtils.readLines(InputStream,encoding);	//文本文件读出 List<String>

int IOUtils.copy(InputStream, OutputStream);

void FileUtils.writeStringToFile(File, String, Charset);

void FileUtils.deleteDirectory(File);

String FilenameUtils.getBaseName(filename);			//获取文件名

String FilenameUtils.getExtension(filename);		//获取扩展名

String FilenameUtils.separatorsToUnix(String path);	//转成 linux 路径分隔符


加解密相关


import org.apache.commons.codec.binary.Base64;

import org.apache.commons.codec.binary.Hex;

import org.apache.commons.codec.digest.DigestUtils;

byte[] Base64.encodeBase64(byte []);

byte[] Base64.decodeBase64(byte[]);

char [] Hex.encodeHex(byte []);

byte [] Hex.decodeHex(char []);

String DigestUtils.md5Hex(String);

String DigestUtils.shaHex(String);


随机数生成


import org.apache.commons.lang3.RandomUtils;

import org.apache.commons.lang3.RandomStringUtils;

int RandomUtils.nextInt(start,end);

long RandomUtils.nextLong(start,end);

String RandomStringUtils.randomNumeric(count);

String RandomStringUtils.randomAlphabetic(count);


其它可以用到的工具


// 秒表

import org.apache.commons.lang3.time.StopWatch;

StopWatch stopWatch = new StopWatch();

stopWatch.start();

stopWatch.getTime();

stopWatch.stop();

//spring 获取方法参数名称

import org.springframework.core.ParameterNameDiscoverer;

ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();

String[] parameterNames = parameterNameDiscoverer.getParameterNames(method);

//spring 用于处理逗号分隔符的字符串列表方法

import org.springframework.util.StringUtils;

String [] StringUtils.tokenizeToStringArray(String str, String delimiters);

从网上搜集的一些其他常用api

1.有些情况下,Arrays满足不到你对数组的操作?不要紧,ArrayUtils帮你

ArrayUtils

public class TestMain {
 
 public static void main(String[] args) {
  int[] nums1 = { 1, 2, 3, 4, 5, 6 };
  // 通过常量创建新数组
  int[] nums2 = ArrayUtils.EMPTY_INT_ARRAY;
 
  // 比较两个数组是否相等
  ArrayUtils.isEquals(nums1, nums2);
 
  // 输出数组,第二参数为数组为空时代替输出
  ArrayUtils.toString(nums1, "array is null");
 
  // 克隆新数组,注意此拷贝为深拷贝
  int[] nums3 = ArrayUtils.clone(nums1);
 
  // 截取数组
  ArrayUtils.subarray(nums1, 1, 2);
 
  // 判断两个数组长度是否相等
  ArrayUtils.isSameLength(nums1, nums2);
 
  // 判断两个数组类型是否相等,注意int和Integer比较时不相等
  ArrayUtils.isSameType(nums1, nums2);
 
  // 反转数组
  ArrayUtils.reverse(nums1);
 
  // 查找数组元素位置
  ArrayUtils.indexOf(nums1, 5);
 
  // 查找数组元素最后出现位置
  ArrayUtils.lastIndexOf(nums1, 4);
 
  // 查找元素是否存在数组中
  ArrayUtils.contains(nums1, 2);
 
  // 将基本数组类型转为包装类型
  Integer[] nums4 = ArrayUtils.toObject(nums1);
 
  // 判断是否为空,length=0或null都属于
  ArrayUtils.isEmpty(nums1);
 
  // 并集操作,合并数组
  ArrayUtils.addAll(nums1, nums2);
 
  // 增加元素,在下标5中插入10,注意此处返回是新数组
  ArrayUtils.add(nums1, 5, 1111);
 
  // 删除指定位置元素,注意返回新数组,删除元素后面的元素会前移,保持数组有序
  ArrayUtils.remove(nums1, 5);
 
  // 删除数组中值为10的元素,以值计算不以下标
  ArrayUtils.removeElement(nums1, 10);
 }
}

2.还在使用传统反射吗?还在被反射的样板代码困扰?看commons如何帮助我们简化反射的工作,从样板代码抽身

ClassUtils

public class TestMain {
 
 public static void main(String[] args) {
  // 获取Test类所有实现的接口
  ClassUtils.getAllInterfaces(Test.class);
 
  // 获取Test类所有父类
  ClassUtils.getAllSuperclasses(Test.class);
 
  // 获取Test类所在的包名
  ClassUtils.getPackageName(Test.class);
 
  // 获取Test类简单类名
  ClassUtils.getShortClassName(Test.class);
 
  // 判断是否可以转型
  ClassUtils.isAssignable(Test.class, Object.class);
 
  // 判断是否有内部类
  ClassUtils.isInnerClass(Test.class);
 
 }
}
ConstructorUtils 

public class TestMain {
 
 public static void main(String[] args) {
 
  // 获取参数为String的构造函数
  ConstructorUtils.getAccessibleConstructor(Test.class, String.class);
 
  // 执行参数为String的构造函数
  Test test = (Test) ConstructorUtils.invokeConstructor(Test.class,
    "Hello");
 }
}
MethodUtils

public static void main(String[] args) throws NoSuchMethodException,
   IllegalAccessException, InvocationTargetException {
  // 调用无参方法
  Test test = new Test();
  MethodUtils.invokeMethod(test, "publicHello", null);
 
  // 调用一参方法
  MethodUtils.invokeMethod(test, "publicHello", "Hello");
 
  // 调用多参方法
  MethodUtils.invokeMethod(test, "publicHello", new Object[] { "100",
    new Integer(10) });
 
  // 调用静态方法
  MethodUtils.invokeStaticMethod(Test.class, "staticHello", null);
 }
FieldUtils 

public class TestMain {
 
 public static void main(String[] args) throws IllegalAccessException {
  Test test = new Test("1", "Ray", "hello");
 
  // 以下两个方法完全一样,都能获取共有或私有变量,因为第三个参数都设置了不检查
  FieldUtils.getDeclaredField(Test.class, "username", true);
  FieldUtils.getField(Test.class, "username", true);
 
  // 读取私有或公共变量的值
  FieldUtils.readField(test, "username", true);
 
  // 读取静态变量
  FieldUtils.readStaticField(Test.class, "STATIC_FIELD");
 
  // 写入私有或共有变量
  FieldUtils.writeField(test, "username", "RayRay", true);
 
  // 写入静态变量
  FieldUtils.writeStaticField(Test.class, "STATIC_FIELD", "static_value");
 }
}

3. 将字符串转换为数字,或判断字符串是否是数字等等操作

NumberUtils帮助我们方便的从字符串转换为数字,在不使用NumberUtils情况下,
若然字符串值不是数字,使用Integer.parseInt()时会报出java.lang.NumberFormatException,
但在NumberUtils的情况下,只会返回0而不产生错误NumberUtils  and  RandomUtils 
public class TestMain {
 public static void main(String[] args) throws IllegalAccessException {
  String str = "12.7";
  /*
   * org.apache.commons.lang.NumberUtils已经被弃用,
   * 注意要引入org.apache.commons.lang.math.NumberUtils
   */
 
  // 判断字符串是否为整数
  NumberUtils.isDigits(str);
 
  // 判断字符串是否为数字
  NumberUtils.isNumber(str);
 
  // 获取参数中最大的值,支持传入数组
  NumberUtils.max(10, 20, 30);
 
  // 获取参数中最小的值,支持传入数组
  NumberUtils.min(10, 20, 30);
 
  // 将字符串转换为int类型,支持float,long,short等数值类型
  NumberUtils.toInt(str);
 
  // 通过字符串创建BigDecimal类型 ,支持int,float,long等数值
  NumberUtils.createBigDecimal(str);
 
 
  /*
   * RandomUtils帮助我们产生随机数,不止是数字类型 , 
   * 连boolean类型都可以通过RandomUtils产生
   */
  RandomUtils.nextBoolean();
  RandomUtils.nextDouble();
  RandomUtils.nextLong();
  // 注意这里传入的参数不是随机种子,而是在0~1000之间产生一位随机数
  RandomUtils.nextInt(1000);
 
 }
}

4. 其他的字符串操作

null的字符串经常让我们报出NullPointerException,
在使用StringUtils后,将不需要为字符串的null值而烦恼,却又提供了更多的操作让我们更方便的操作字符串 
StringUtils 
 

public class TestMain {
 public static void main(String[] args) throws IllegalAccessException {
  String str = "Hello World";
  /*
   * 由于StringUtils拥有100+的方法,笔者不逐一列举用法,
   * 只列举笔者认为常用的或笔者使用过的
   */
 
  // isEmpty和isBlank的区别在于isEmpty不会忽略空格,
  // " "<--对于这样的字符串isEmpty会认为不是空,
        // 而isBlank会认为是空,isBlank更常用
  StringUtils.isEmpty(str);
  StringUtils.isNotEmpty(str);
  StringUtils.isBlank(str);
  StringUtils.isNotBlank(str);
  // strip      --> 去除两端的aa
  // stripStart --> 去除开始位置的hell
  // stripEnd   --> 去除结尾位置的orld
  StringUtils.strip(str, "aa");
  StringUtils.stripStart(str, "hell");
  StringUtils.stripEnd(str, "orld");
 
 
  // 返回字符串在第三次出现A的位置
  StringUtils.ordinalIndexOf(str, "A", 3);
 
 
  // 获取str 开始为hello结尾为orld中间的字符串
  // 注意此方法返回字符串      -->substringBetween
  // 注意此方法返回字符串数组(多了个s) --> substringsBetween
  StringUtils.substringBetween(str, "hell", "orld");
  StringUtils.substringsBetween(str, "hell", "orld");
 
 
  // 重复字符串,第二种重载形式为在重复中用hahah拼接
  StringUtils.repeat(str, 3);
  StringUtils.repeat(str, "hahah", 2);
 
 
  // 统计参数2在字符串中出现的次数
  StringUtils.countMatches(str, "l");
 
 
  // 判断字符串是否全小写或大写
  StringUtils.isAllLowerCase(str);
  StringUtils.isAllUpperCase(str);
 
 
  // isAlpha        --> 全部由字母组成返回true
  // isNumeric      -->全部由数字组成返回true
  // isAlphanumeric -->全部由字母或数字组成返回true
  // isAlphaSpace   -->全部由字母或空格组成返回true
  // isWhitespace   -->全部由空格组成返回true
  StringUtils.isAlpha(str);
  StringUtils.isNumeric(str);
  StringUtils.isAlphanumeric(str);
  StringUtils.isAlphaSpace(str);
  StringUtils.isWhitespace(str);
 
 
  // 缩进字符串,第二参数最低为 4,要包含...
  // 现在Hello World输出为H...
  StringUtils.abbreviate(str, 4);
 
 
  // 首字母大写或小写
  StringUtils.capitalize(str);
  StringUtils.uncapitalize(str);
 
 
  // 将字符串数组转变为一个字符串,通过","拼接,支持传入iterator和collection
  StringUtils.join(new String[] { "Hello", "World" }, ",");
 
 
 
  /*
   * 经常性要把后台的字符串传递到前提作为html代码进行解释,
   * 可以使用以下方法进行转换,以下方法输出为
   * <p>Hello</p>
   */
  StringEscapeUtils.escapeHtml("Hello
");
 }
}

5.DateUtils and DateFormatUtils

public class TestMain {
 public static void main(String[] args) throws IllegalAccessException {
  Date day1 = new Date();
  /*
   * 由于Aache的DateUtils和DateFormatUtils并没有Joda强大,
   *  所以在这里只作简单的示例
   */
  
  // 增加一天
  DateUtils.addDays(day1, 1);
  // 减少一年
  DateUtils.addYears(day1, -1);
 
  // 格式化时间,第三参数为国际化,表示按美国时间显示
  DateFormatUtils.format(day1, "yyyy-MM-dd", Locale.UK);
 
 }
}
 类似资料: