Java常用工具类

apache common

commons-lang3

<dependency>
	<groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.9</version>
</dependency>

1. StringUtils

StringUtils.isBlank(str):判断字符串是否为null/“”/" "/制表符(推荐)

StringUtils.isNotBlank(str):判断字符串是否不为null/“”/" "/制表符(推荐)

StringUtils.isEmpty(str):判断字符串是否为null/“”

StringUtils.isNotEmpty(str):判断字符串是否不为null/“”

StringUtils.left(3):返回某个字符串左边的几个字符

StringUtils.right(4):返回某个字符串右边的几个字符

手机号脱敏 18412340006 -> 184****0006,StringUtils.left(str, 3) + “****” + StringUtils.right(str, 4);

StringUtils.leftPad(str, 7, ‘*’):左填充,7位,不够用*号填充

StringUtils.rightPad(str, , ‘*’):右填充,7位,不够用*号填充

String left = StringUtils.left(str, 3)
String right = StringUtils.right(str, 4);
StringUtils.rightPad(left, 7, '*') + right; //和上方效果一样,同样脱敏

StringUtils.uncapitalize(str):首字母小写

StringUtils.capitalize(str):首字母大写

StringUtils.eq(str1, str2):判断相等,省了非空判断

StringUtils.contains(str1, str2):判断str1是否包含str2

StringUtils.containsIgnoreCase(str1, str2):判断str1是否包含str2,忽略大小写

StringUtils.containsWhitespace(str):判断是否包含空格/tab/换行符

字符串截取:

String str = “a_b-c-d”;

StringUtils.substringBefore(str, “-”); //a_b,截取指定字符前面的,不包括指定字符

StringUtils.substringAfter(str, “-”); //c-d,截取指定字符后面的,不包括指定字符

StringUtils.substringBeforeLast(str, “-”); //a_b-c,截取指定字符(若有多个,则用最后一个)前面的,不包括指定字符

StringUtils.substringAfterLast(str, “-”); //d,截取指定字符(若有多个,则用最后一个)后面的,不包括指定字符

2. NumberUtils

NumberUtils.isDigits(str):判断是否整数

NumberUtils.isParsable(str):判断是否数字(整数、浮点数),不能识别正负

NumberUtils.isCreatable(str):判断是否数字(整数、浮点数),能识别正负和进制

NumberUtils.isDigits("09");			 // true,十进制
NumberUtils.isParsable("09");		// true,十进制
NumberUtils.isCreatable("012");	//true
NumberUtils.isCreatable("09");	  // false,以0开头认为是8进制

NumberUtils.toLong(str, defaultValue):字符串转Long,失败默认返回0,有指定值就返回

String str = "2423hhh";
NumberUtils.toLong(str);		// 0
NumberUtils.toLong(str, 100);	// 100

NumberUtils.toDouble(str):字符串转Double

NumberUtils.toFloat(str):字符串转Float

3. ObjectUtils

ObjectUtils.firstNonNull(str1, str2, str3):返回第一个不为空的参数

ObjectUtils.identityToString(str):返回十六进制的字符串

4. ArrayUtils

ArrayUtils.isEmpty(object):判断数组是否为空(null/长度为0)

ArrayUtils.isNotEmpty(object):判断数组是否不为空(null/长度为0)

ArrayUtils.toString(object):打印数组内容

ArrayUtils.add(arr, element):给已有数组添加元素,会自动创建新数组

5. FieldUtils

另外可以看下MethodUtils

FieldUtils.readField(data, fieldName, forceAccess):获取属性的值

@Data
public class Man{
	private Long id;
}

Man man = new Man();
man.setId(1L);
Object id = FieldUtils.readField(man, "id", true);// 1,如果为false,则报没有权限访问

6. RandomStringUtils

RandomStringUtils.random(count, str):随机从指定字符串中选择count个字符

RandomStringUtils.randomAlphanumeric(count):随机大小写英文字母和数字

RandomStringUtils.random(count, true, true):随机大小写英文字母和数字

RandomStringUtils.randomAscii(count):[32,127)组成的随机字符串

7. RegExUtils

正则表达式验证工具类

RegExUtils.isIDCard18(str):验证身份证号码18位

RegExUtils.isMobileSimple(str):验证手机号(简单)

RegExUtils.isMobileExact(str):验证手机号(精确)

RegExUtils.isEmail(str):验证邮箱

RegExUtils.isURL(str):验证URL

RegExUtils.isChinese(str):验证汉字

RegExUtils.isDate(str):验证yyyy-MM-dd格式的日期校验

RegExUtils.isIP(str):验证IP地址

RegExUtils.estimate(str):判断是否匹配正则

8. SerializationUtils

SerializationUtils.serialize(object):序列化

SerializationUtils.deserialize(byte[]):反序列化

Student student = new Student();
student.setClassName("一班");
// 序列化
byte[] serialize = SerializationUtils.serialize(student);
// 反序列化
Student deserialize = SerializationUtils.deserialize(serialize);
System.out.println(deserialize.getClass() + ":" + deserialze);

commons-collections4

<dependency>
	<groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

1. CollectionsUtils

CollectionUtils.isEmpty(list):判断list/set是否为空(null/size>0)

CollectionsUtils.isNotEmpty(list):判断list/set是否不为空(null/size>0)

CollectionsUtils.intersection(list1, list2):两个集合取交集

CollectionsUtils.union(list1, list2):两个集合取并集

CollectionsUtils.subtract(list1, list2):两个集合取差集

List<String> list1 = new ArrayList<>();
list1.add("a");list1.add("b");list1.add("c");
List<String> list2 = new ArrayList<>();
list2.add("c");list2.add("1");list2.add("2");
CollectionsUtils.intersection(list1, list2);//取交集,c
CollectionsUtils.union(list1, list2);//取并集,a,b,c,1,2
CollectionsUtils.subtract(list1, list2);//取差集,list1-list2->a,b
CollectionsUtils.subtract(list2, list1);//取差集,list2-list1->1,2

2.MapUtils

MapUtils.isEmpty(map):判断map是否为空(null/size>0)

MapUtils.isNotEmpty(map):判断map是否不为空(null/size>0)

MapUtils.getInteger(map, “hh”):获取map中key=hh的值并转为Integer

commons-io

<dependency>
	<groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

1. FileUtils

FileUtils.readFileToString(new File(path), StandardCharsets.UTF_8):读取指定的文本文件的内容为一个字符串

FileUtils.readLines(new File(path), StandardCharsets.UTF_8):读取指定的文本文件的内容为List

FileUtils.copyFile(new File(path1), new File(path2)):拷贝文件,如果文件存在,则会覆盖

FileUtils.deleteQuietly(new File(path)):删除文件或递归删除目录(包含目录本身),如果目录不存在不会报错

FileUtils.checksumCRC32(new File(path)):计算crc32的值,常用于压缩文件

String path = this.getClass().getResource("/1.txt").getPath();
FileUtils.readFileToString(new File(path), StandardCharsets.UTF_8);

2. FilenameUtils

FilenameUtils.getName(path):获取文件名 1.txt

FilenameUtils.getBaseName(path):获取文件的baseName 1

FilenameUtils.getExtension(path):获取文件的后缀 txt

common-text

<dependency>
	<groupId>org.apache.commons</groupId>
    <artifactId>commons-text</artifactId>
    <version>1.11.0</version>
</dependency>

xss:Cross Site Scripting,利用网页漏洞嵌入js脚本,以达到窃取用户cookie,跳转到其他网站等

解决方案:

后端把HTML中的特殊字符转义为字符实体,如<转为“&lt;”后存储,转换的方法:

  • 第一种:StringEscapeUtils.escapeHtml4
  • 第二种:spring里的HtmlUtils.htmlEscape
  • 第三种:jsoup里的clean()/text(),完全去除html标签,只留下纯文本

StringEscapeUtils

StringEscapeUtils.escapeHtml4:将特殊字符转换为对应的HTML实体形式,从而防止这些字符在网页中被解析为HTML标签或脚本,有助于防止跨站脚本攻击(XSS, Cross-Site Scripting)

Path path = Paths.get(Test.class.getClassLoader().getResource("text_xss.html").toURI());
String xssHtml = FileUtils.readFileToString(path.toFile(), StandardCharsets.UTF_8);
String escapeHtml4 = StringEscapeUtils.escapeHtml4(xssHtml);
// 还原出原始内容
String originalHtml = StringEscapeUtils.unescapeHtml4(escapeHtml4);

apache tika

<!--用于识别文件类型-->
<dependency>
	<groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>2.9.2</version>
</dependency>
<!--支持上千种不同类型的文件解析,如PPT,XLS,PDF-->
<dependency>
	<groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers-standard-package</artifactId>
    <version>2.9.2</version>
</dependency>

tika:文件类型检测(比其他工具更准确,也是依据文件类型魔数进行判断),内容提取工具,推荐

Tika tika = new Tika();
MimeTypes mimeTypes = MimeTypes.getDefualtMimeTypes();

File file = new File("d:\\tmp");
File[] files = file.listFiles();
for(File f : files){
    if(f.isDirectory()){
        continue;
    }
    String mimeTypeName = tika.detect(f);
    MimeType mimeType = mimeTypes.forName(mimeTypeName);
    // 比如如果将某个txt文件后缀改成了png,其mimeTypeName和扩展名还是txt的,更加准确
    System.out.println(f.getName() + "的mimeTypeName是:" + mimeTypeName + ",扩展名:" + mimeType.getExtension());
}

guava

<dependency>
	<groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>29.0-jre</version>
</dependency>

1. Joiner

Joiner.on(“,”).join(list):把集合(或数组或可变参数)通过指定的分隔符连接成字符串

Joiner.on(“,”).skipNulls.join(list):忽略null

Joiner.on(“,”).useForNull(“替代”).join(list):指定值替代null

List<String> list = new ArrayList<String>();
list.add("a");list.add("b");list.add("c");
Joiner joiner = Joiner.on(",");	// 出现null元素,会报错
joiner.join(list);	//a,b,c
list.add(null);

Joiner joiner2 = Joiner.on(",").skipNulls;	//忽略null
joiner2.join(list);	//a,b,c
Joiner.on(",").useForNull("替代");	// 指定值替代null

list.stream().filter(StringUtils::isNotBlank).collect(Collectors.joining(","));	//等同于忽略null那个

2. Splitter

Splitter.on(“,”).split(str):通过指定的分隔符把字符串转为集合

String str = "a,b,c";
Splitter splitter = Splitter.on(",")
    .omitEmptyStrings()// 过滤掉空白字符串(不包括"")
    .trimResults()//去除每个元素的前后空格
Iterable<String> iterable = splitter.split(str); 	//[a,b,c]
List<String> list = splitter.splitToList(str);	// [a,b,c],直接转为list

3. CaseFormat

CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, str):下划线转驼峰

CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, str):驼峰转下划线

CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "student_name");	//studentName
CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "studentName");	//student_name

4. Lists

另有Sets、Maps

Lists.newArrayList(str, str, …):创建集合

Lists.partition(list, size):将list分成指定大小size的小集合

List<String> list = new ArrayList<>();
list.add("a");list.add("b");list.add("c");
ArrayList<String> list2 = Lists.newArrayList("a", "b", "c");//等同于上面
List<List<String>> partition = Lists.partition(list2, 2);	//[[a,b], [c]],取代List2.subList()
使用场景:要求你传ids,一次最多传2个,(调用别人的api)
for(List<String> ids : partition){
	api(ids);
}

5. Ints

另有Longs、Floats等

Ints.asList(1, 2, 3, …):转list

List<Integer> integers = Ints.asList(1,2,3);	//[1,2,3]

6. HashMultiset

list:元素可重复的有序集合

set:元素不可重复的无序集合

HashMultiset.create():创建元素可重复的无序集合

HashMultiset<String> multiset = HashMultiset.create();
multiset.add("a");multiset.add("b");multiset.add("a");	//[a x 2, b]
Set<Multiset.Entry<String>> entries = multiset.entrySet();	//[a x 2, b]
for (Multiset.Entry<String> entry : entries) {
	System.out.println("元素:" + entry.getElement() + ",个数:" + entry.getCount());
}
Set<String> elementSet = multiset.elementSet();	//[a, b]
for (String ele : elementSet) {
	System.out.println("集合里面的元素:" + ele);
}

7. HashMultimap

HashMultimap用来替代jdk原生的Map<String, Collection> map;变得简洁

HashMultimap.create():创建Map

HashMultimap<String, String> multimap = HashMultimap.create();
multimap.put("a", "1");multimap.put("a", "2");multimap.put("a", "3");
Collection<String> aValue = multimap.get("a");	//[1, 2, 3]
multimap.containsEntry("a", "1");//true,是否包含key=a,value=1的entry
Map<String, Collection<String>> jdkMap = multimap.asMap();	//{a=[1, 2, 3]},转化成jdk原生api实现的数据结构

8. ImmutableList

另有ImmutableSet、ImmutableMap

ImmutableList.builder().add(“aa”).build():不可变集合

ImmutableList<Object> immutableList = ImmutableList.builder().add("aa").build();	//[aa]
// 如果执行add操作会报错:UnsupportedOperationException
immutableList.add("bb");

9. Preconditions

校验工具

Preconditions.checkNotNull(str, value):检查参数是否为空

Preconditions.checkArgument(expression, value):校验expression表达式,true->校验通过,不抛异常;false->抛异常

String param = null;
if(param == null){
	throw new RuntimeException("参数不能为空");
}

上方代码等同于:
Preconditions.checkNotNull(param , "参数不能为空");
Preconditions.checkArgument(param != null, "参数不能为空");

10. Stopwatch

代替System.currentTimeMills()监控耗时

// 创建自动start的计时器,不需要再手动调用start
Stopwatch stopwatch = Stopwatch.createStarted();
Threap.sleep(1000);
// 自start到此刻共用时多久
long elapsed = stopwatch.elapsed(TimeUnit.MILLISECONDS);
Threap.sleep(1000);
elapsed = stopwatch
    // 只能调用一次,多次调用报错
    // 如果不调用stop,之后再调用elapsed,则会一直计算耗时
    .stop()
    .elapsed(TimeUnit.MILLISECONDS);

Spring中的工具类

1. ClassUtils

ClassUtils.isPresent(class, classLoader):判断当前应用是否加载了class这样的类

应用场景:当某个类存在后再做某些事情

ClassUtils.isPresent(“cn.com.hh.TestController.java”, null); //类存在时,返回true;不存在,返回false

2. ReflectionUtils

Spring对反射相关的操作

  • 获取本类以及所有的父类(包含父类的父类…)的所有属性
ReflectionUtils.doWithFields(ZhangSan.class, new ReflectionUtils.FieldCallback() {
    @Override
    public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {
        System.out.println(field.getName());//myProp id name
    }
});

当指针放在new ReflectionUtils.FieldCallback再按Alt+Enter,出现Replace with lambda,回车后代码变更简洁:

ReflectionUtils.doWithFields(ZhangSan.class, field -> System.out.println(field.getName()));
  • 获取本类以及所有的父类(包含父类的父类…)的所有方法
ReflectionUtils.doWithMethods(ZhangSan.class, method ->
                System.out.println(method.getDeclaringClass().getName() + "的" + method.getName()));

Method[] allDeclaredMethods = ReflectionUtils.getAllDeclaredMethods(ZhangSan.class);
for (Method method : allDeclaredMethods) {
	System.out.println(method.getDeclaringClass().getName() + "的" + method.getName());
}

两种方式效果一样,都会罗列出所有的方法
  • 获取某个属性的值
ZhangSan zhangSan = new ZhangSan();
zhangSan.setId(1);
ReflectionUtils.doWithFields(ZhangSan.class, field -> {
    field.setAccessible(true);
    System.out.println(ReflectionUtils.getField(field, zhangSan));//null 1 null
});

Person:

@Data
public class Person {
    private long id;
    private String name;
}

Zhangsan:

@Data
public class ZhangSan extends Person{
    private String myProp;
}

3. BeanUtils

BeanUtils.copyProperties(source, target):复制source对象的属性到target对象

Zhangsan:

@Override
public String toString() {
    return super.toString() + "ZhangSan{" +
        "myProp='" + myProp + '\'' +
        '}';
}
ZhangSan zhangSan1 = new ZhangSan();
zhangSan1.setId(1L);
zhangSan1.setName("张三");
zhangSan1.setMyProp("myProp");

ZhangSan target = new ZhangSan();
BeanUtils.copyProperties(zhangSan1, target);
System.out.println(zhangSan1);   //Person(id=1, name=张三)ZhangSan{myProp='myProp'}

4. FileCopyUtils

FileCopyUtils.copy(intputStream, outputStream):复制文件

// 获取类路径下的资源
ClassPathResource resource = new ClassPathResource("file/1.txt");
EncodedResource encodedResource = new EncodedResource(resoutce, StandardCharsets.UTF_8);

String targetPath = "指定文件的全路径";
FileCopyUtils.copy(encodeResource.getInputStream(), new FileOutputStream(targetPath)); // 复制1.txt的内容到指定文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值