目录
1.2 org.springframework.util.CollectionUtils常用方法:
1.3 org.apache.commons.collections.CollectionUtils常用方法:
1.4 org.apache.commons.lang.ArrayUtils
1.5 org.apache.commons.lang3.ArrayUtils
1.6 com.google.common.collect.Lists
2.1 org.apache.commons.io.IOUtils
2.2 org.apache.commons.io.FileUtils
2.3 org.apache.commons.io.FilenameUtils
3.1 org.apache.commons.lang.StringUtils
3.2 org.apache.commons.lang3.StringUtils
3.3 org.springframework.util.StringUtils
3.4 org.apache.commons.lang3.StringEscapeUtils(废弃)
4.2 org.apache.http.util.EntityUtils
4.3 org.apache.commons.beanutils.PropertyUtils
4.4 org.apache.commons.beanutils.BeanUtils
4.5 org.springframework.beans.BeanUtils
4.6 org.springframework.util.ClassUtils
4.7 org.springframework.util.ReflectionUtils
5.1 org.apache.http.client.utils.URLEncodedUtils
5.2 org.apache.http.HttpStatus
5.3 org.springframework.util.SerializationUtils
6.1 org.apache.commons.codec.digest.DigestUtils
6.2 org.springframework.util.Base64Utils
6.3 java.nio.charset.StandardCharsets
7.1 org.apache.commons.lang3.BooleanUtils
7.2 org.springframework.util.Assert
1 集合工具类
1.1 java.util.Collections
使用的基本list示意
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
1.1.1 基本操作
Collections.sort(list);//升序
Collections.reverse(list);//降序
Collections.max(list);//获取最大值
Collections.min(list);//获取最小值
Collections.emptyList();//空集合
Collections.binarySearch(list, 3);//二分查找
Collections.unmodifiableList(list);//转换成不可修改集合
1.1.2 转换线程安全集合
我们都知道,java中的很多集合,比如:ArrayList、LinkedList、HashMap、HashSet等,都是线程不安全的。
换句话说,这些集合在多线程的环境中,添加数据会出现异常。
这时,可以用Collections的synchronizedxxx方法,将这些线程不安全的集合,直接转换成线程安全集合。例如
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
List<Integer> integers = Collections.synchronizedList(list);//将ArrayList转换成线程安全集合
System.out.println(integers);
它的底层会创建SynchronizedRandomAccessList或者SynchronizedList类,这两个类的很多方法都会用synchronized加锁
1.2 org.springframework.util.CollectionUtils
常用方法:
1.3 org.apache.commons.collections.CollectionUtils
常用方法:
常用方法:
CollectionUtils.isEmpty();//集合判空
CollectionUtils.union(list, list2);//获取并集
CollectionUtils.intersection(list, list2);//获取交集
CollectionUtils.disjunction(list, list2);//获取交集的补集
CollectionUtils.subtract(list, list2);//获取差集
CollectionUtils.select:根据条件筛选集合元素
CollectionUtils.transform:根据指定方法处理集合元素,类似List的map()
CollectionUtils.filter:过滤元素,雷瑟List的filter()
CollectionUtils.find:基本和select一样
CollectionUtils.collect:和transform 差不多一样,但是返回新数组
CollectionUtils.forAllDo:调用每个元素的指定方法
CollectionUtils.isEqualCollection:判断两个集合是否一致
1.4 org.apache.commons.lang.ArrayUtils
contains:是否包含某字符串
addAll:添加整个数组
clone:克隆一个数组
isEmpty:是否空数组
add:向数组添加元素
subarray:截取数组
indexOf:查找某个元素的下标
isEquals:比较数组是否相等
toObject:基础类型数据数组转换为对应的Object数组
1.5 org.apache.commons.lang3.ArrayUtils
contains:是否包含某个字符串
addAll:添加整个数组
clone:克隆一个数组
isEmpty:是否空数组
add:向数组添加元素
subarray:截取数组
indexOf:查找某个元素的下标
isEquals:比较数组是否相等
toObject:基础类型数据数组转换为对应的Object数组
1.6 com.google.common.collect.Lists
Lists.newArrayList();//创建空集合
Lists.newArrayList(1, 2, 3);//快速初始化集合
Lists.cartesianProduct(list1,list2);//笛卡尔积
Lists.partition(list, 2);//分页,将一个大集合分成若干个小集合
Lists.transform(list, x -> x.toUpperCase());//把某个集合转换成另外一个接口,可以使用Lists的transform方法
Lists.reverse(list);//颠倒顺序
2 文件流工具类
2.1 org.apache.commons.io.IOUtils
closeQuietly:关闭一个IO流、socket、或者selector且不抛出异常,通常放在finally块
toString:读取文件,转换IO流、 Uri、 byte[]为String,例:IOUtils.toString(new FileInputStream(“/temp/a.txt”), StandardCharsets.UTF_8);
copy:文件拷贝,IO流数据复制,从输入流写到输出流中,最大支持2GB,例:IOUtils.copy(new FileInputStream(“/temp/a.txt”), new FileOutputStream(“/temp/b.txt”));
toByteArray:读取文件内容到字节数组,从输入流、URI获取byte[],IOUtils.toByteArray(new FileInputStream(“/temp/a.txt”));
write:写入文件,把字节. 字符等写入输出流,例:IOUtils.write(str, new FileOutputStream(“/temp/b.tx”), StandardCharsets.UTF_8);
toInputStream:把字符转换为输入流
readLines:从输入流中读取多行数据,返回List<String>
copyLarge:同copy,支持2GB以上数据的复制
lineIterator:从输入流返回一个迭代器,根据参数要求读取的数据量,全部读取,如果数据不够,则失败
其他常用方法:
2.2 org.apache.commons.io.FileUtils
deleteDirectory:删除文件夹
readFileToString:以字符形式读取文件内容
deleteQueitly:删除文件或文件夹且不会抛出异常
copyFile:复制文件
writeStringToFile:把字符写到目标文件,如果文件不存在,则创建
forceMkdir:强制创建文件夹,如果该文件夹父级目录不存在,则创建父级
write:把字符写到指定文件中
listFiles:列举某个目录下的文件(根据过滤器)
copyDirectory:复制文件夹
forceDelete:强制删除文件
2.3 org.apache.commons.io.FilenameUtils
getExtension:返回文件后缀名
getBaseName:返回文件名,不包含后缀名
getName:返回文件全名
concat:按命令行风格组合文件路径(详见方法注释)
removeExtension:删除后缀名
normalize:使路径正常化
wildcardMatch:匹配通配符
seperatorToUnix:路径分隔符改成unix系统格式的,即/
getFullPath:获取文件路径,不包括文件名
isExtension:检查文件后缀名是不是传入参数(List<String>)中的一个
3 字符串工具类
3.1 org.apache.commons.lang.StringUtils
isBlank:字符串是否为空 (trim后判断)
isEmpty:字符串是否为空 (不trim并判断)
equals:字符串是否相等
join:合并数组为单一字符串,可传分隔符
split:分割字符串
EMPTY:返回空字符串
trimToNull:trim后为空字符串则转换为null
replace:替换字符串
3.2 org.apache.commons.lang3.StringUtils
isBlank:字符串是否为空 (trim后判断)
isEmpty:字符串是否为空 (不trim并判断)
equals:字符串是否相等
join:合并数组为单一字符串,可传分隔符,例:StringUtils.join(list, “,”)
split:分割字符串,StringUtils.split(str1,”,”)和str1.split(“,”)区别:使用StringUtils的split方法会返回null,而使用String的split方法会报指针异常
EMPTY:返回空字符串
replace:替换字符串
capitalize:首字符大写
StringUtils.isNumeric(str1);//判断是否纯数字
3.3 org.springframework.util.StringUtils
hasText:检查字符串中是否包含文本
hasLength:检测字符串是否长度大于0
isEmpty:检测字符串是否为空(若传入为对象,则判断对象是否为null)
commaDelimitedStringToArray:逗号分隔的String转换为数组
collectionToDelimitedString:把集合转为CSV格式字符串
replace 替换字符串
delimitedListToStringArray:相当于split
uncapitalize:首字母小写
collectionToDelimitedCommaString:把集合转为CSV格式字符串
tokenizeToStringArray:和split基本一样,但能自动去掉空白的单词
3.4 org.apache.commons.lang3.StringEscapeUtils(废弃)
unescapeHtml4:转义html
escapeHtml4:反转义html
escapeXml:转义xml
unescapeXml:反转义xml
escapeJava:转义unicode编码
escapeEcmaScript:转义EcmaScript字符
unescapeJava:反转义unicode编码
escapeJson:转义json字符
escapeXml10:转义Xml10
这个现在已经废弃了,建议使用commons-text包里面的方法。
4 对象属性及反射工具类
4.1 java.util.Objects
Objects.isNull(integer);//对象为空
Objects.nonNull(integer);//对象不为空
Objects.requireNonNull(integer1, “参数不能为空”);//对象为空抛异常
Objects.equals(integer1, integer2);//判断两个对象是否相等,Objects给我们提供了equals方法
Objects.hashCode(str);//获取对象的hashCode
4.2 org.apache.http.util.EntityUtils
toString:把Entity转换为字符串
consume:确保Entity中的内容全部被消费。可以看到源码里又一次消费了Entity的内容,假如用户没有消费,那调用Entity时候将会把它消费掉
toByteArray:把Entity转换为字节流
consumeQuietly:和consume一样,但不抛异常
getContentCharset:获取内容的编码
4.3 org.apache.commons.beanutils.PropertyUtils
getProperty:获取对象属性值
setProperty:设置对象属性值
getPropertyDiscriptor:获取属性描述器
isReadable:检查属性是否可访问
copyProperties:复制属性值,从一个对象到另一个对象
getPropertyDiscriptors:获取所有属性描述器
isWriteable:检查属性是否可写
getPropertyType:获取对象属性类型
4.4 org.apache.commons.beanutils.BeanUtils
copyPeoperties:复制属性值,从一个对象到另一个对象
getProperty:获取对象属性值
setProperty:设置对象属性值
populate:根据Map给属性复制
copyPeoperty:复制单个值,从一个对象到另一个对象
cloneBean:克隆bean实例
4.5 org.springframework.beans.BeanUtils
BeanUtils.copyProperties(user1, user2);//拷贝对象的属性
BeanUtils.instantiateClass(User.class);//实例化某个类
BeanUtils.findDeclaredMethod(User.class, “getId”);//获取指定类的指定方法
BeanUtils.findPropertyForMethod(declaredMethod);//获取指定方法的参数
使用例子:
Method declaredMethod = BeanUtils.findDeclaredMethod(User.class, “getId”);
PropertyDescriptor propertyForMethod = BeanUtils.findPropertyForMethod(declaredMethod);
System.out.println(propertyForMethod.getName())
4.6 org.springframework.util.ClassUtils
ClassUtils.getAllInterfaces(new User());//获取对象的所有接口
ClassUtils.getPackageName(User.class);//获取某个类的包名
ClassUtils.isInnerClass(User.class);//判断某个类是否内部类
ClassUtils.isCglibProxy(new User());//判断对象是否代理对象
4.7 org.springframework.util.ReflectionUtils
Method method = ReflectionUtils.findMethod(User.class, “getId”);//获取方法
Field field = ReflectionUtils.findField(User.class, “id”);//获取字段
ReflectionUtils.invokeMethod(method, springContextsUtil.getBean(beanName), param);//执行方法
ReflectionUtils.isPublicStaticFinal(field);//判断字段是否常量
ReflectionUtils.isEqualsMethod(method);//判断某个方法是否equals方法
5 网络序列化工具类
5.1 org.apache.http.client.utils.URLEncodedUtils
format:格式化参数,返回一个HTTP POST或者HTTP PUT可用application/x-www-form-urlencoded字符串
parse:把String或者URI等转换为List<NameValuePair>
5.2 org.apache.http.HttpStatus
把常用的http返回码给我们定义好了,直接拿来用就可以了,真的不用再重复定义了(org.springframework.http.HttpStatus也是同样的)
5.3 org.springframework.util.SerializationUtils
有时候,我们需要把数据进行序列化和反序列化处理。传统的做法是某个类实现Serializable接口,然后重新它的writeObject和readObject方法。但如果使用org.springframework.util包下的SerializationUtils工具类,能更轻松实现序列化和反序列化功能。
Map<String, String> map = Maps.newHashMap();
map.put(“a”, “1”);
map.put(“b”, “2”);
map.put(“c”, “3”);
byte[] serialize = SerializationUtils.serialize(map);
Object deserialize = SerializationUtils.deserialize(serialize);
System.out.println(deserialize);
6 加解密工具类
6.1 org.apache.commons.codec.digest.DigestUtils
md5Hex:MD5加密,返回32位字符串,例:DigestUtils.md5Hex(“技术”);
sha1Hex:SHA-1加密
sha256Hex:SHA-256加密,例:DigestUtils.sha256Hex(“技术”);
sha512Hex:SHA-512加密
md5:MD5加密,返回16位字符串
6.2 org.springframework.util.Base64Utils
有时候,为了安全考虑,需要将参数只用base64编码。这时就能直接使用org.springframework.util包下的Base64Utils工具类。
它里面包含:encode和decode方法,用于对数据进行加密和解密。例如
String str = “abc”;
String encode = new String(Base64Utils.encode(str.getBytes()));
System.out.println(“加密后:” + encode);
try {
String decode = new String(Base64Utils.decode(encode.getBytes()), “utf8”);
System.out.println(“解密后:” + decode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
6.3 java.nio.charset.StandardCharsets
我们在做字符转换的时候,经常需要指定字符编码,比如:UTF-8、ISO-8859-1等等。这时就可以直接使用java.nio.charset包下的StandardCharsets类中静态变量。
例如:
String str = “abc”;
String encode = new String(Base64Utils.encode(str.getBytes()));
System.out.println(“加密后:” + encode);
String decode = new String(Base64Utils.decode(encode.getBytes()), StandardCharsets.UTF_8);
System.out.println(“解密后:” + decode);
7 其他工具类
7.1 org.apache.commons.lang3.BooleanUtils
BooleanUtils.isTrue(aBoolean);//判断true
BooleanUtils.isFalse(aBoolean);//判断false
BooleanUtils.isNotTrue(aBoolean);//判断不为true
BooleanUtils.isNotFalse(aBoolean);//判断不为false
BooleanUtils.toInteger(aBoolean);//转换成数字,将true转换成数字1,false转换成数字0
BooleanUtils.toBoolean(aBoolean);//Boolean转换成布尔值,将包装类Boolean对象,转换成原始的boolean对象,可以使用toBoolean方法
7.2 org.springframework.util.Assert
7.2.1 断言参数是否为空
String str = null;
Assert.isNull(str, “str必须为空”);
Assert.isNull(str, () -> “str必须为空”);
Assert.notNull(str, “str不能为空”);
如果不满足条件就会抛出IllegalArgumentException异常
7.2.2 断言集合是否为空
断言集合是否空,如果不满足条件,则直接抛异常,如果不满足条件就会抛出IllegalArgumentException异常
List<String> list = null;
Map<String, String> map = null;
Assert.notEmpty(list, “list不能为空”);
Assert.notEmpty(list, () -> “list不能为空”);
Assert.notEmpty(map, “map不能为空”);
7.2.3 断言条件是否为空
断言是否满足某个条件,如果不满足条件,则直接抛异常。
List<String> list = null;
Assert.isTrue(CollectionUtils.isNotEmpty(list), “list不能为空”);
Assert.isTrue(CollectionUtils.isNotEmpty(list), () -> “list不能为空”);
7.3 org.slf4j.MDC
MDC是org.slf4j包下的一个类,它的全称是Mapped Diagnostic Context,我们可以认为它是一个线程安全的存放诊断日志的容器。
MDC的底层是用了ThreadLocal来保存数据的。我们可以用它传递参数。
例如现在有这样一种场景:我们使用RestTemplate调用远程接口时,有时需要在header中传递信息,比如:traceId,source等,便于在查询日志时能够串联一次完整的请求链路,快速定位问题。这种业务场景就能通过ClientHttpRequestInterceptor接口实现,具体做法如下
第一步,定义一个LogFilter拦截所有接口请求,在MDC中设置traceId:
public class LogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
MdcUtil.add(UUID.randomUUID().toString());
System.out.println(“记录请求日志”);
chain.doFilter(request, response);
System.out.println(“记录响应日志”);
}
@Override
public void destroy() {
}
}
第二步,实现ClientHttpRequestInterceptor接口,MDC中获取当前请求的traceId,然后设置到header中
public class RestTemplateInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
request.getHeaders().set(“traceId”, MdcUtil.get());
return execution.execute(request, body);
}
}
第三步,定义配置类,配置上面定义的RestTemplateInterceptor类:
@Configuration
public class RestTemplateConfiguration {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(Collections.singletonList(restTemplateInterceptor()));
return restTemplate;
}
@Bean
public RestTemplateInterceptor restTemplateInterceptor() {
return new RestTemplateInterceptor();
}
}
其中MdcUtil其实是利用MDC工具在ThreadLocal中存储和获取traceId
public class MdcUtil {
private static final String TRACE_ID = “TRACE_ID”;
public static String get() {
return MDC.get(TRACE_ID);
}
public static void add(String value) {
MDC.put(TRACE_ID, value);
}
}
能使用MDC保存traceId等参数的根本原因是,用户请求到应用服务器,Tomcat会从线程池中分配一个线程去处理该请求。那么该请求的整个过程中,保存到MDC的ThreadLocal中的参数,也是该线程独享的,所以不会有线程安全问题