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中的特殊字符转义为字符实体,如<转为“<”后存储,转换的方法:
- 第一种: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的内容到指定文件