JAVA常用工具类

  • Post author:
  • Post category:java



目录


1 集合工具类


1.1 java.util.Collections


1.1.1 基本操作


1.1.2 转换线程安全集合


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 文件流工具类


2.1 org.apache.commons.io.IOUtils


2.2 org.apache.commons.io.FileUtils


2.3 org.apache.commons.io.FilenameUtils


3 字符串工具类


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 对象属性及反射工具类


4.1 java.util.Objects


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 网络序列化工具类


5.1 org.apache.http.client.utils.URLEncodedUtils


5.2 org.apache.http.HttpStatus


5.3 org.springframework.util.SerializationUtils


6 加解密工具类


6.1 org.apache.commons.codec.digest.DigestUtils


6.2 org.springframework.util.Base64Utils


6.3 java.nio.charset.StandardCharsets


7 其他工具类


7.1 org.apache.commons.lang3.BooleanUtils


7.2 org.springframework.util.Assert


7.2.1 断言参数是否为空


7.2.2 断言集合是否为空


7.2.3 断言条件是否为空


7.3 org.slf4j.MDC


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中的参数,也是该线程独享的,所以不会有线程安全问题



版权声明:本文为yudaonihaha原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。