一篇文章讲明白JAVA常用的工具类

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 一篇文章讲明白JAVA常用的工具类

1 集合工具类

1.1 java.util.Collections

使用的基本list示意

List 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 list = new ArrayList();

list.add(2);

list.add(1);

list.add(3);

List 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

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)中的一个

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

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 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(//代码效果参考:http://www.zidongmutanji.com/zsjx/174783.html

str, () -> "str必须为空");

Assert.notNull(str, "str不能为空");

如果不满足条件就会抛出IllegalArgumentException异常

7.2.2 断言集合是否为空

断言集合是否空,如果不满足条件,则直接抛异常,如果不满足条件就会抛出IllegalArgumentException异常

List list = null;

Map map = null;

Assert.notEmpty(list, "list不能为空");

Assert.notEmpty(list, () -> "list不能为空");

Assert.notEmpty(map, "map不能为空");

7.2.3 断言条件是否为空

断言是否满足某个条件,如果不满足条件,则直接抛异常。

List 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中设置//代码效果参考:http://www.zidongmutanji.com/zsjx/432645.html

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 {

//代码效果参考:http://www.zidongmutanji.com/zsjx/436643.html

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

————————————————

版权声明:本文为CSDN博主「爱吃牛肉的大老虎」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

相关文章
|
3天前
|
Java
JAVA工具类匹配重复或者连续的字符和符号
JAVA工具类匹配重复或者连续的字符和符号
8 2
|
4天前
|
算法 Java
基于java雪花算法工具类SnowflakeIdUtils-来自chatGPT
基于java雪花算法工具类SnowflakeIdUtils-来自chatGPT
12 3
|
2天前
|
缓存 NoSQL Java
Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
6 0
|
2天前
|
存储 NoSQL Java
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
4 0
|
2天前
|
存储 NoSQL Java
Redis系列学习文章分享---第二篇(Redis快速入门之Java客户端--Jedis+连接池+SpringDataRedis+RedisTemplate+RedisSerializer+Hash)
Redis系列学习文章分享---第二篇(Redis快速入门之Java客户端--Jedis+连接池+SpringDataRedis+RedisTemplate+RedisSerializer+Hash)
6 0
|
3天前
|
JSON Java 数据安全/隐私保护
一篇文章讲明白Java第三方支付接入案例(支付宝)
一篇文章讲明白Java第三方支付接入案例(支付宝)
|
3天前
|
存储 Dubbo Java
一篇文章讲明白Java的深拷贝和浅拷贝
一篇文章讲明白Java的深拷贝和浅拷贝
11 0
|
4天前
|
Java 语音技术 Windows
一篇文章讲明白java文本转语音
一篇文章讲明白java文本转语音
|
4天前
|
存储 编解码 安全
一篇文章讲明白java字符流字节流
一篇文章讲明白java字符流字节流
|
4天前
|
开发框架 Oracle Java
一篇文章讲明白Java简介
一篇文章讲明白Java简介