目录
1.isEmpty 和 isNotEmpty:用于检查集合是否为空。
6.containsAny:判断一个集合是否包含另一个集合中的任意元素。
文中并没有给出工具类所有的方法,只是抛砖引玉,提出几个比较常用的方法。
Collections
Collections 类是 Java 中的一个工具类,它包含了一系列静态方法,用于对集合进行操作。这个类位于 java.util
包中。以下是一些常用的 Collections 类方法:
-
排序:
sort(List<?> list)
: 对指定的列表按自然顺序进行排序。sort(List<?> list, Comparator<? super T> c)
: 按指定的比较器对列表进行排序。
-
洗牌:
shuffle(List<?> list)
: 使用默认的随机源对列表进行随机洗牌。shuffle(List<?> list, Random rnd)
: 使用指定的随机源对列表进行随机洗牌。
-
反转:
reverse(List<?> list)
: 反转列表的顺序。
-
二分搜索:
binarySearch(List<? extends T> list, T key)
: 在自然排序的列表中进行二分查找。binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
: 在按比较器排序的列表中进行二分查找。
-
最大/最小值:
max(Collection<? extends T> coll)
: 返回集合中的最大元素。min(Collection<? extends T> coll)
: 返回集合中的最小元素。
-
替换元素:
replaceAll(List<?> list, Object oldVal, Object newVal)
: 将列表中所有旧值替换为新值。
-
同步控制:
synchronizedList(List<T> list)
: 返回一个线程安全的列表。synchronizedMap(Map<K,V> m)
: 返回一个线程安全的映射。synchronizedSet(Set<T> s)
: 返回一个线程安全的集合。
-
不可变视图:
unmodifiableList(List<? extends T> list)
: 返回一个不可修改的列表视图。unmodifiableMap(Map<? extends K,? extends V> m)
: 返回一个不可修改的映射视图。unmodifiableSet(Set<? extends T> s)
: 返回一个不可修改的集合视图。
-
空集合:
emptyList()
: 返回一个空的不可修改的列表。emptyMap()
: 返回一个空的不可修改的映射。emptySet()
: 返回一个空的不可修改的集合。
-
频率统计:
frequency(Collection<?> c, Object o)
: 返回指定元素在集合中出现的次数。
这些方法可以用于各种集合操作,使得集合的使用更加方便和强大。以下是一些示例代码:
import java.util.*;
public class CollectionsExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>(Arrays.asList("B", "C", "A", "D", "E"));
// 排序
Collections.sort(list);
System.out.println("Sorted List: " + list);
// 洗牌
Collections.shuffle(list);
System.out.println("Shuffled List: " + list);
// 反转
Collections.reverse(list);
System.out.println("Reversed List: " + list);
// 二分搜索
int index = Collections.binarySearch(list, "C");
System.out.println("Index of 'C': " + index);
// 最大值
String max = Collections.max(list);
System.out.println("Max element: " + max);
// 替换元素
Collections.replaceAll(list, "C", "Z");
System.out.println("List after replacing 'C' with 'Z': " + list);
// 同步控制
List<String> syncList = Collections.synchronizedList(list);
// 不可变视图
List<String> unmodifiableList = Collections.unmodifiableList(new ArrayList<>(Arrays.asList("A", "B", "C")));
System.out.println("Unmodifiable List: " + unmodifiableList);
// 空集合
List<String> emptyList = Collections.emptyList();
System.out.println("Empty List: " + emptyList);
// 频率统计
int frequency = Collections.frequency(list, "Z");
System.out.println("Frequency of 'Z': " + frequency);
}
}
CollectionUtils
对集合操作,除了前面说的 Collections工具类之后,CollectionUtils 工具类也非常常用。目前比较主流的是spring
的org.springframework.util
包下的CollectionUtils工具类和apache
的org.apache.commons.collections
包下的CollectionUtils 工具类。
我个人更推荐使用apache的包下的CollectionUtils工具类,因为它的工具更多更全面。
以下是一些常用的 CollectionUtils 方法:
1.isEmpty 和 isNotEmpty:用于检查集合是否为空。
if (CollectionUtils.isEmpty(collection)) {
// 集合为空的处理逻辑
}
if (CollectionUtils.isNotEmpty(collection)) {
// 集合不为空的处理逻辑
}
2.union:获取两个集合的并集
Collection<?> unionCollection = CollectionUtils.union(collection1, collection2);
3.intersection:获取两个集合的交集。
Collection<?> intersectionCollection = CollectionUtils.intersection(collection1, collection2);
4.disjunction:获取两个集合的交集的补集
Collection<?> disjunctionCollection = CollectionUtils.disjunction(collection1, collection2);
5.subtract:获取两个集合的差集。
Collection<?> subtractCollection = CollectionUtils.subtract(collection1, collection2);
6.containsAny:判断一个集合是否包含另一个集合中的任意元素。
boolean containsAny = CollectionUtils.containsAny(collection1, collection2);
7.transform:对集合中的每个元素应用转换函数。
List<String> transformedList = CollectionUtils.transform(list, new Transformer<String, Object>() {
public String transform(Object input) {
return input.toString();
}
});
8.find:查找集合中满足特定条件的第一个元素。
T foundElement = CollectionUtils.find(collection, new Predicate<T>() {
public boolean evaluate(T item) {
return item.equals(targetElement);
}
});
在使用 CollectionUtils 时,需要注意它并不是 Java 标准库的一部分,因此需要确保相应的库已经添加到项目的依赖中。例如,如果是使用 Apache Commons Collections 的 CollectionUtils,则需要添加相应的 Maven 依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
Lists
Guava 库中的 Lists 工具类是一个非常有用的工具,它提供了很多静态方法来操作 List
对象。
Guava 是 Google
开源的一个 Java
工具库,里面有很多工具类,这里要讲的是里面的 Lists工具类。
添加依赖
注意,使用 Guava 工具类库,必须先添加依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.0</version>
</dependency>
以下是一些常见的 Lists
类的使用方式:
-
创建新的ArrayList
Lists.newArrayList()
: 创建一个空的ArrayList
。Lists.newArrayList(E... elements)
: 根据给定的元素创建一个ArrayList
。Lists.newArrayList(Iterable<? extends E> elements)
: 从Iterable
创建一个ArrayList
。Lists.newArrayList(Iterator<? extends E> elements)
: 从Iterator
创建一个ArrayList
。Lists.newArrayListWithCapacity(int initialArraySize)
: 创建一个具有指定初始容量的ArrayList
。Lists.newArrayListWithExpectedSize(int estimatedSize)
: 创建一个预计大小的ArrayList
。
-
分区列表
Lists.partition(List list, int size)
: 将一个列表均匀地划分为多个子列表。
-
反转列表
Lists.reverse(List list)
: 反转列表的顺序。
-
转换列表
Lists.transform(List list, Function function)
: 对列表中的每个元素应用一个函数,并返回一个新的列表。
-
字符列表
Lists.charactersOf(String string)
: 将字符串转换为字符的列表。
-
创建不可变列表
Lists.asList(E first, E[] rest)
: 创建一个不可变的列表,包含第一个元素和数组中的元素。Lists.asList(E first, E second, E[] rest)
: 创建一个不可变的列表,包含前两个元素和数组中的元素。
-
创建线程安全的列表
Lists.newCopyOnWriteArrayList()
: 创建一个空的线程安全的CopyOnWriteArrayList
。Lists.newCopyOnWriteArrayList(Iterable<? extends E> elements)
: 根据给定的元素创建一个线程安全的CopyOnWriteArrayList
。
-
创建链表
Lists.newLinkedList()
: 创建一个空的LinkedList
。Lists.newLinkedList(Iterable<? extends E> elements)
: 根据给定的元素创建一个LinkedList
。
-
列表差集
Lists.setDifference(List<?> list1, List<?> list2)
: 返回两个列表的差集。
-
列表子集
Lists.subList(List<?> list, int fromIndex, int toIndex)
: 返回列表的子集(注意这是List
接口的方法,不是 Guava 特有的)。
Objects
Java标准库中的java.util.Objects
类是在Java 7中引入的,它提供了一些实用的方法来操作和比较对象。以下是一些常用的Objects
类方法:
-
equals
Objects.equals(Object a, Object b)
: 比较两个对象是否相等。这个方法是equals
方法的简化形式,可以替代(a == b) || (a != null && a.equals(b))
。
-
hashCode
Objects.hashCode(Object o)
: 返回对象的hashCode
值,如果对象为null
,则返回0。
-
toString
Objects.toString(Object o)
: 返回对象的String
表示,如果对象为null
,则返回字符串"null"。Objects.toString(Object o, String nullDefault)
: 返回对象的String
表示,如果对象为null
,则返回提供的默认值。
-
比较
Objects.compare(T a, T b)
: 使用自然顺序比较两个对象,如果a
小于b
返回负数,如果a
等于b
返回0,如果a
大于b
返回正数。Objects.compare(T a, T b, Comparator<? super T> cmp)
: 使用提供的Comparator
比较两个对象。
-
非空检查
Objects.requireNonNull(Object obj)
: 如果对象不是null
,则返回对象;如果是null
,则抛出NullPointerException
。Objects.requireNonNull(Object obj, String message)
: 如果对象不是null
,则返回对象;如果是null
,则抛出带有自定义消息的NullPointerException
。
-
检查元素索引
Objects.checkIndex(int index, int size)
: 检查索引是否在有效范围内,如果不在,则抛出IndexOutOfBoundsException
。Objects.checkFromToIndex(int fromIndex, int toIndex, int size)
: 检查从索引到索引的范围是否有效。
-
类型检查
Objects.requireNonNullElse(T obj, T defaultObj)
: 如果对象不是null
,则返回对象;如果是null
,则返回默认对象。Objects.requireNonNullElseGet(T obj, Supplier<? extends T> defaultSupplier)
: 如果对象不是null
,则返回对象;如果是null
,则返回由供应商提供的默认对象。
-
组合哈希码
Objects.hash(Object... values)
: 根据一组对象计算出一个哈希码,这个哈希码可以用于hashCode
方法的实现。
java.util.Objects 类的方法通常用于简化常见的对象操作,如比较、哈希码计算和非空检查,使得代码更加简洁和易于维护。
BooleanUtils
在java中布尔值,随处可见。如果你使用了布尔的包装类:Boolean
,总感觉有点麻烦,因为它有三种值:null
、true
、false
。我们在处理 Boolean 对象时,需要经常判空。
头疼!!!
但如果使用BooleanUtils
类处理布尔值,心情一下子就愉悦起来了。
Apache Commons Lang库中的BooleanUtils
类提供了许多用于处理布尔值的实用方法。以下是一些常用的方法:
-
逻辑运算
and(boolean... array)
: 对一组布尔值进行逻辑与运算。or(boolean... array)
: 对一组布尔值进行逻辑或运算。xor(boolean... array)
: 对一组布尔值进行逻辑异或运算。
-
布尔值判断
isTrue(Boolean bool)
: 判断布尔值是否为true
。isFalse(Boolean bool)
: 判断布尔值是否为false
。isNotTrue(Boolean bool)
: 判断布尔值是否不是true
(即为null
或false
)。isNotFalse(Boolean bool)
: 判断布尔值是否不是false
(即为null
或true
)。
-
布尔值转换
toBoolean(Boolean bool)
: 将Boolean
对象转换为基本数据类型的boolean
值。toBooleanObject(int value)
: 将int
值转换为Boolean
对象。toBooleanObject(Integer value)
: 将Integer
对象转换为Boolean
对象。
-
字符串转换
toBoolean(String str)
: 将字符串转换为布尔值。
-
整数转换
toInteger(boolean bool)
: 将布尔值转换为整数(true
为1,false
为0)。
-
字符串表示
toStringOnOff(boolean bool)
: 将布尔值转换为"on"或"off"字符串。toStringTrueFalse(Boolean bool)
: 将布尔值转换为"true"或"false"字符串。toStringYesNo(boolean bool)
: 将布尔值转换为"yes"或"no"字符串。
-
比较
compare(boolean x, boolean y)
: 比较两个布尔值并返回整数值。
-
默认值
toBooleanDefaultIfNull(Boolean bool, boolean valueIfNull)
: 如果布尔值为null
,则返回默认值。
StringUtils
StringUtils
是 Apache Commons Lang 库中的一个非常强大的工具类,它提供了一系列用于操作字符串的方法。以下是一些常用的 StringUtils
方法:
-
-
空值检查:
isEmpty(String str)
: 检查字符串是否为空(null或空字符串)。isNotEmpty(String str)
: 检查字符串是否非空。isBlank(String str)
: 检查字符串是否为空或仅包含空白字符。isNotBlank(String str)
: 检查字符串是否非空且不只包含空白字符。
-
修剪字符串:
trim(String str)
: 去除字符串首尾的空白字符。trimToEmpty(String str)
: 去除字符串首尾的空白字符,如果结果为null或空字符串,则返回空字符串。trimToNull(String str)
: 去除字符串首尾的空白字符,如果结果为空字符串,则返回null。
-
字符串转换:
capitalize(String str)
: 将字符串的第一个字符转换为大写。uncapitalize(String str)
: 将字符串的第一个字符转换为小写。upperCase(String str)
: 将字符串转换为大写。lowerCase(String str)
: 将字符串转换为小写。
-
字符串比较:
equals(String str1, String str2)
: 比较两个字符串是否相等。equalsIgnoreCase(String str1, String str2)
: 比较两个字符串是否相等,忽略大小写。
-
子串操作:
substring(String str, int start)
: 从指定位置开始截取子串。substring(String str, int start, int end)
: 从指定开始位置到结束位置截取子串。
-
字符串连接:
join(Iterable<?> iterable, String separator)
: 使用指定的分隔符将可迭代对象中的元素连接成一个字符串。
-
字符串分割:
split(String str, String separator)
: 使用指定的分隔符将字符串分割成数组。
-
字符串替换:
replace(String str, String searchString, String replacement)
: 替换字符串中所有出现的搜索字符串为指定的替换字符串。
-
字符串查找:
indexOf(String str, CharSequence seq)
: 返回指定字符序列在字符串中首次出现的索引。
-
其他:
deleteWhitespace(String str)
: 删除字符串中的所有空白字符。
-
Assert
很多时候,我们需要在代码中做判断:如果不满足条件,则抛异常。有没有统一的封装呢?其实spring
给我们提供了Assert
类,它表示断言
。
断言参数是否为空
断言参数
是否空,如果不满足条件,则直接抛异常。
String str = null;
Assert.isNull(str, "str必须为空");
Assert.notNull(str, "str不能为空");
-
如果不满足条件就会抛出
IllegalArgumentException
异常。
断言集合是否为空
断言集合
是否空,如果不满足条件,则直接抛异常。
List<String> list = null;
Map<String, String> map = null;
Assert.notEmpty(list, "list不能为空");
Assert.notEmpty(map, "map不能为空");
断言条件是否为空
断言是否满足某个条件
,如果不满足条件,则直接抛异常。
List<String> list = null;
Assert.isTrue(CollectionUtils.isNotEmpty(list), "list不能为空");
Assert.isTrue(CollectionUtils.isNotEmpty(list), () -> "list不能为空");
IOUtils
IOUtils 类是 Apache Commons IO 库中的一个工具类,它提供了一系列静态方法来简化 Java I/O 编程。以下是一些 IOUtils 类的常用方法及其详解:
可以通过 new FileInputStream("/temp/a.txt") 和 new FileOutputStream("/temp/b.txt") 来获取输入流和输出流对象
关闭对象
closeQuietly(Closeable closeable)
- 无条件地关闭一个可关闭的对象,即使关闭时抛出异常,也不会向外抛出。这个方法是处理资源关闭的常用方法,可以避免资源泄漏。
比较文件内容
contentEquals(InputStream input1, InputStream input2):
- 比较两个输入流的内容是否相同。如果两个流的内容完全一致,返回
true
,否则返回false
。
拷贝文件内容
copy(InputStream input, OutputStream output):
- 将内容从
InputStream
复制到OutputStream
,并返回复制的字节数。这个方法内部使用了缓冲区,通常比手动循环复制效率更高。
行迭代器
lineIterator(InputStream input, String encoding):
- 从
InputStream
中返回一个行迭代器,可以逐行读取流中的数据。这个迭代器会持有一个打开的InputStream
的引用,因此在使用完毕后应该关闭流以释放资源。
将数据转换为流
toInputStream(CharSequence input, String encoding):
- 将字符序列(如字符串)转换为
InputStream
。这个操作经常用于将内存中的数据转换为流,以便进一步处理。
将流转换为数据
toString(InputStream input)
- 将
InputStream
转换为字符串。默认使用平台的字符编码。如果需要指定编码,可以使用toString(InputStream input, String encoding)
。
将数据写入文件
write(String data, Writer output):
- 将字符串写入
Writer
。如果data
为null
,则不执行任何操作。
将多行文本写入文件
writeLines(Collection lines, String lineEnding, Writer output):
- 将字符串集合写入
Writer
,每个元素占一行,并使用指定的行结尾符。这个方法常用于将多行文本写入文件。
读取行(将文件中的内容一行一行读出来)
readLines(InputStream input, String encoding):
- 从
InputStream
中读取行并返回字符串列表。每个流中的行都是列表中的一个元素。默认使用平台的字符编码,也可以指定编码。
读取文件中的二进制数据(图片或文件)
toByteArray(InputStream input)
- 从
InputStream
中读取数据并转换为字节数组。这个方法常用于读取二进制数据,如图片或文件。
读取指定长度的二进制数据
readFully(InputStream input, byte[] buffer):
- 从
InputStream
中读取数据并填充到字节数组中。这个方法确保读取了指定长度的数据,如果数据不足,会抛出EOFException
。
跳过输入流中的指定数量的字节
skipFully(InputStream input, long skipAmount):
跳过输入流中的指定数量的字节。如果跳过的字节数不足,会抛出 EOFException
。
这些方法的实现细节和使用场景各有不同,但它们共同的目标是简化 I/O 操作,提高代码的可读性和可维护性。在使用 IOUtils
类时,应该注意异常处理和资源管理,确保在操作完成后释放所有资源。
ClassUtils
ClassUtils是 Apache Commons Lang 库中的一个工具类,它提供了一系列静态方法来操作和获取类的信息。以下是一些 ClassUtils
类的常用方法及其详解:
返回指定类的包名
getPackageName(Class<?> clazz):
- 返回指定类的包名。如果类位于默认包中,则返回空字符串。
- 示例:
ClassUtils.getPackageName(String.class)
返回 "java.lang"。
返回类的简单名称(不包括包名)
getSimpleName(Class<?> clazz):
- 返回类的简单名称(不包括包名)。
- 示例:
ClassUtils.getSimpleName(String.class)
返回 "String"。
返回类的规范化全名(包括包名和简单类名)
getShortCanonicalName(Class<?> clazz):
- 返回类的规范化全名(包括包名和简单类名)。
- 示例:
ClassUtils.getShortCanonicalName(String.class)
返回 "java.lang.String"。
返回类的简单名称
getShortClassName(Class<?> clazz):
- 返回类的简单名称,对于数组类型,会返回数组的组件类型的简单名称,后面跟上相应的维度信息。
- 示例:
ClassUtils.getShortClassName(int[].class)
返回 "int[]"。
检查类是否是 Java 基本数据类型
isPrimitive(Class<?> cls):
- 检查指定的类是否是 Java 基本数据类型。
- 示例:
ClassUtils.isPrimitive(int.class)
返回true
。
检查类是否是 Java 基本数据类型的包装类
isPrimitiveWrapper(Class<?> cls):
- 检查指定的类是否是 Java 基本数据类型的包装类。
- 示例:
ClassUtils.isPrimitiveWrapper(Integer.class)
返回true
。
检查是否可以将一个类的对象分配给另一个类的引用
isAssignable(Class<?> cls, Class<?> toClass):
- 检查是否可以将一个类的对象分配给另一个类的引用,考虑自动装箱和拆箱。
- 示例:
ClassUtils.isAssignable(Number.class, Integer.class)
返回true
。
检查是否可以将一个值赋给指定类型的引用
isAssignableValue(Class<?> cls, Object value):
- 检查是否可以将一个值赋给指定类型的引用,考虑自动装箱和拆箱。
- 示例:
ClassUtils.isAssignableValue(Number.class, 10)
返回true
。
将类名的列表转换为 Class
对象的列表
convertClassNamesToClasses(List<String> classNames):
- 将类名的列表转换为
Class
对象的列表。 - 示例:
ClassUtils.convertClassNamesToClasses(Arrays.asList("java.lang.Integer", "java.lang.String"))
。
将 Class
对象的集合转换为类名的列表
convertClassesToClassNames(Collection<Class<?>> classes):
- 将
Class
对象的集合转换为类名的列表。 - 示例:
ClassUtils.convertClassesToClassNames(Arrays.asList(Integer.class, String.class))
。
返回指定类的所有父类
getAllSuperclasses(Class<?> cls):
- 返回一个列表,包含指定类的所有父类,从最近的父类开始,不包括接口。
- 示例:
ClassUtils.getAllSuperclasses(Number.class)
返回一个列表,包括Number
的所有父类。
返回类及其父类实现的所有接口
getAllInterfaces(Class<?> cls):
- 返回一个列表,包含指定类及其父类实现的所有接口。
- 示例:
ClassUtils.getAllInterfaces(List.class)
返回List
及其父接口的列表。
检查指定的类是否是内部类
isInnerClass(Class<?> cls):
- 检查指定的类是否是内部类。
- 示例:
ClassUtils.isInnerClass(Map.Entry.class)
返回true
。
返回类的缩写名称
getAbbreviatedName(Class<?> cls, int abbreviateLen):
- 返回类的缩写名称,通常用于日志和错误消息。
- 示例:
ClassUtils.getAbbreviatedName(String.class, 5)
返回 "j.l.Str"。
这些方法通常用于反射操作、类型检查、类名和类对象之间的转换等场景。在使用 ClassUtils
类时,应该注意异常处理和资源管理,确保在操作完成后释放所有资源。
BeanUtils
BeanUtils 是一个用于操作 JavaBean 的工具类库,它在 org.springframework.beans
包下面,提供了一些实用的方法来简化 JavaBean 对象之间的属性复制、设置和获取等操作。
拷贝对象的属性值
copyProperties(Object orig, Object dest): 将源对象 orig
的属性值复制到目标对象 dest
中。如果属性名相同,它会进行属性值的复制。
Person source = new Person();
source.setName("John");
source.setAge(30);
Person destination = new Person();
BeanUtils.copyProperties(source, destination);
System.out.println("Destination Name: " + destination.getName());
System.out.println("Destination Age: " + destination.getAge());
设置对象的属性值
setProperty(Object bean, String name, Object value): 动态设置对象的属性值。如果属性存在并且可写,此方法会设置属性值。
Person person = new Person();
BeanUtils.setProperty(person, "name", "Alice");
BeanUtils.setProperty(person, "age", 25);
获取对象的属性值
getProperty(Object bean, String name): 动态获取对象的属性值。如果属性存在并且有 getter 方法,此方法会返回属性值。
String name = BeanUtils.getProperty(person, "name");
System.out.println("Name: " + name);
浅拷贝对象
cloneBean(Object bean): 创建并返回原始 JavaBean 的副本。这是一个浅拷贝操作,即只复制对象的引用而不复制对象本身。
Person original = new Person("Bob", 40);
Person clone = (Person) BeanUtils.cloneBean(original);
System.out.println("Original: " + original);
System.out.println("Clone: " + clone);
将 Map 数据封装到指定的 JavaBean
populate(Object bean, Map properties): 将 Map 数据封装到指定的 JavaBean 中,一般用于将表单数据封装到 JavaBean 中。
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.add("name", "John");
pvs.add("age", 30);
Person person = new Person();
BeanUtils.populate(person, pvs);
System.out.println(person.getName()); // 输出:John
返回对象的 JavaBean 属性描述符的 Map
Person person = new Person();
person.setName("John");
Map<String, PropertyDescriptor> descriptors = BeanUtils.describe(person);
for (Map.Entry<String, PropertyDescriptor> entry : descriptors.entrySet()) {
System.out.println(entry.getKey());
}
返回类的 JavaBean 属性描述符数组
findPropertyDescriptors(Class clazz, String... excluded): 返回指定类的 JavaBean 属性描述符数组,可以排除指定的属性描述符。
PropertyDescriptor[] descriptors = BeanUtils.findPropertyDescriptors(Person.class, "id");
判断类是否是一个简单的 JavaBean 属性类型
isSimpleProperty(Class<?> type): 判断给定的类是否是一个简单的 JavaBean 属性类型(如基本类型、String 等)。
boolean isSimple = BeanUtils.isSimpleProperty(String.class); // 返回 true
获取指定属性描述符所描述的属性的简单类型
getSimplePropertyType(PropertyDescriptor descriptor): 获取指定属性描述符所描述的属性的简单类型。
PropertyDescriptor descriptor = new PropertyDescriptor("name", Person.class);
Class<?> simpleType = BeanUtils.getSimplePropertyType(descriptor);
System.out.println(simpleType.getName()); // 输出:java.lang.String
获取对象的属性值
getPropertyValue(Object bean, String name): 获取指定 Java Bean 对象的属性值。
User user = new User();
user.setName("John");
Object value = BeanUtils.getPropertyValue(user, "name");
System.out.println(value); // 输出:John
设置对象的属性值
setPropertyValue(Object bean, String name, Object value): 设置指定 Java Bean 对象的属性值。
User user = new User();
BeanUtils.setPropertyValue(user, "name", "John");
System.out.println(user.getName()); // 输出:John
ImageIO
ImageIO 是 Java 中 javax.imageio
包下的一个类,它提供了一个用于读取和写入图片的简单接口。ImageIO 利用了服务提供者接口(SPI)来支持多种图片格式,如 JPEG、PNG、GIF 等。
以下是 ImageIO 类的一些常用方法:
读取图片
-
ImageIO.read(InputStream input)
- 从输入流中读取图片。
- 返回值:
BufferedImage
对象。
-
ImageIO.read(File input):
- 从文件中读取图片。
- 返回值:
BufferedImage
对象。
写入图片:
-
ImageIO.write(RenderedImage im, String formatName, OutputStream output):
- 将
RenderedImage
对象写入输出流,可以指定图片格式。 formatName
参数指定图片的格式,如 "jpg"、"png"。
- 将
-
ImageIO.write(RenderedImage im, String formatName, File output):
- 将
RenderedImage
对象写入文件,可以指定图片格式。
- 将
获取图片格式:
-
ImageIO.getReaderFormatFileName(String fileName):
- 根据文件名获取图片的格式。
-
ImageIO.getReaderMIMETypes():
- 获取所有支持的图片格式及其 MIME 类型。
示例代码:
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try {
// 读取图片
File inputfile = new File("input.jpg");
BufferedImage image = ImageIO.read(inputfile);
// 处理图片(这里省略了处理过程)
// 写入图片
File outputfile = new File("output.jpg");
ImageIO.write(image, "jpg", outputfile);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Base64Utils
Base64Utils 是 Spring 框架提供的一个工具类,它包含了一系列用于 Base64 编码和解码的方法。这个工具类简化了将二进制数据转换为 Base64 编码的字符串以及将 Base64 编码的字符串解码回原始二进制数据的过程。
Base64Utils 提供的主要方法有:
-
encodeToString(byte[] input)
: 将字节数组编码为 Base64 编码的字符串。 -
decodeFromString(String input)
: 将 Base64 编码的字符串解码为原始的字节数组。 -
encodeUrlSafe(byte[] input)
: 将字节数组编码为 URL 安全的 Base64 编码字符串。 -
decodeUrlSafe(String input)
: 将 URL 安全的 Base64 编码字符串解码为原始的字节数组。
使用 Base64Utils 进行编码和解码的示例代码如下:
import org.springframework.util.Base64Utils;
// 编码示例
byte[] binaryData = "Hello, World!".getBytes();
String encodedString = Base64Utils.encodeToString(binaryData);
System.out.println(encodedString); // 输出 Base64 编码后的字符串
// 解码示例
String encodedString = "SGVsbG8sIFdvcmxkIQ=="; // 假设这是 "Hello, World!" 的 Base64 编码
byte[] decodedBytes = Base64Utils.decodeFromString(encodedString);
String decodedString = new String(decodedBytes);
System.out.println(decodedString); // 输出解码后的字符串 "Hello, World!"
Base64 编码适用于在需要将二进制数据以文本形式表示时使用,例如在电子邮件、网页或其他需要文本格式的场合中传输二进制文件。而 URL 安全的 Base64 编码则适用于在 URL 中传输数据,因为它避免了使用可能会被解释为 URL 分隔符的字符。
请注意,Base64 编码并不是一种加密方法,它仅仅是一种编码手段,因此不适合用于保护敏感信息的安全传输。
StandardCharsets
StandardCharsets 是 Java 中 java.nio.charset
包下的一个类,它定义了一组标准的特性集(Charsets),这些特性集用于支持字符串的编码和解码。这个类在 Java 7 中引入,旨在提供一种便捷的方式来处理字符集,而不需要每次手动指定字符集的名称。
StandardCharsets 中定义了一些常用的字符集,例如:
UTF_8
:8位 UCS 转换格式,用以编码 Unicode 字符。UTF_16
:16位 UCS 转换格式,用以编码 Unicode 字符。UTF_16BE
:Big-endian 版本的 UTF-16。UTF_16LE
:Little-endian 版本的 UTF-16。ISO_8859_1
:拉丁字母表 No.1,用于西欧语言。US_ASCII
:美国标准信息交换代码,用于英文和一些特殊字符。UTF_32
:32位 UCS 转换格式,用以编码 Unicode 字符。UTF_32BE
:Big-endian 版本的 UTF-32。UTF_32LE
:Little-endian 版本的 UTF-32。GBK
:用于简体中文的扩展字符集。
使用 StandardCharsets
的好处是不需要关心字符集名称的硬编码,也不需要处理 Charset
对象的创建,可以直接使用 StandardCharsets
中定义的静态常量。例如:
import java.nio.charset.StandardCharsets;
public class CharsetExample {
public static void main(String[] args) {
String text = "Hello, World!";
byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
// 使用 StandardCharsets 来解码字节数组
String decodedText = new String(bytes, StandardCharsets.UTF_8);
System.out.println(decodedText); // 输出 "Hello, World!"
}
}
DigestUtils
DigestUtils 是 Spring 和 Apache Commons Codec 中提供的一个工具类,用于生成数据的摘要(哈希值)。它支持多种常用的哈希算法,如 MD5、SHA-1、SHA-256 等。以下是一些常用方法及其代码示例:
常用方法
-
MD5 哈希
md5DigestAsHex(byte[] bytes)
:返回字节数组的 MD5 哈希值(以十六进制字符串形式返回)。md5Digest(String input)
:计算给定字符串的 MD5 哈希值,并返回字节数组表示。
代码示例:
import org.springframework.util.DigestUtils;
public class MD5Example {
public static void main(String[] args) {
String input = "Hello, World!";
String md5Hex = DigestUtils.md5DigestAsHex(input.getBytes());
System.out.println("MD5 Hash: " + md5Hex);
}
}
-
SHA-1 哈希
sha1DigestAsHex(String input)
:计算给定字符串的 SHA-1 哈希值,并返回其十六进制表示。
import org.springframework.util.DigestUtils;
public class SHA1Example {
public static void main(String[] args) {
String input = "Hello, World!";
String sha1Hex = DigestUtils.sha1DigestAsHex(input.getBytes());
System.out.println("SHA-1 Hash: " + sha1Hex);
}
}
-
SHA-256 哈希
sha256DigestAsHex(String input)
:计算给定字符串的 SHA-256 哈希值,并返回其十六进制表示。
import org.springframework.util.DigestUtils;
public class SHA256Example {
public static void main(String[] args) {
String input = "Hello, World!";
String sha256Hex = DigestUtils.sha256DigestAsHex(input.getBytes());
System.out.println("SHA-256 Hash: " + sha256Hex);
}
}
注意事项
- 不可逆性:哈希算法是单向的,无法从哈希值恢复原始数据。
- 碰撞风险:不同的输入可能产生相同的哈希值,尤其是 MD5 和 SHA-1 已被认为不够安全,建议使用 SHA-256 或更高版本。
- 性能考虑:哈希计算需要一定的计算资源,处理大量数据时需注意性能问题。
通过使用 DigestUtils
,开发者可以方便地生成数据的哈希值,适用于密码存储、数据完整性验证等场景
SerializationUtils
SerializationUtils 是 Spring 框架中的一个实用工具类,它提供了对象序列化和反序列化的方法。以下是 SerializationUtils 的常用方法及其代码案例:
常用方法
-
serialize(Object object):
- 将给定的对象序列化成字节数组。
-
deserialize(byte[] bytes):
- 将字节数组反序列化成对象。
-
clone(T object):
- 使用 Java 对象序列化来克隆一个对象。这将创建对象的深拷贝。
代码案例
序列化和反序列化
// 创建一个可序列化的对象
MySerializableObject original = new MySerializableObject("data", 123);
// 序列化对象
byte[] serialized = SerializationUtils.serialize(original);
// 反序列化对象
MySerializableObject cloned = (MySerializableObject)SerializationUtils.deserialize(serialized);
// 使用 SerializationUtils 进行深拷贝
MySerializableObject deepCopy = SerializationUtils.clone(original);
- 所有需要序列化的对象都必须实现
java.io.Serializable
接口。 - 序列化和反序列化过程可能会抛出
IOException
或ClassNotFoundException
异常,需要适当处理。 - 序列化和反序列化操作可能会消耗较多的 CPU 和内存资源,尤其是在处理大型对象或对象图时。
- 序列化的数据可能会被篡改或损坏,因此在反序列化之前应验证数据的完整性和安全性。
通过使用 SerializationUtils
,可以简化对象的序列化和反序列化过程,同时实现对象的深拷贝。
HttpStatus
很多时候,我们会在代码中定义http的返回码,比如:接口正常返回200,异常返回500,接口找不到返回404,接口不可用返回502等。
但其实org.springframework.http
包下的 HttpStatus 枚举,或者org.apache.http
包下的 HttpStatus 接口,已经把常用的http返回码给我们定义好了,直接拿来用就可以了,真的不用再重复定义了。
以下是一些常见的 HttpStatus 状态码:
HttpStatus.OK
(200):请求成功并且服务器返回了期望的响应。HttpStatus.CREATED
(201):请求成功并且服务器创建了新的资源。HttpStatus.ACCEPTED
(202):服务器已接受请求,但尚未处理。HttpStatus.NO_CONTENT
(204):服务器成功处理了请求,但没有返回任何内容。HttpStatus.MOVED_PERMANENTLY
(301):永久重定向。HttpStatus.FOUND
(302):临时重定向。HttpStatus.BAD_REQUEST
(400):服务器无法理解请求格式,客户端应检查请求。HttpStatus.UNAUTHORIZED
(401):请求未授权,需要认证信息。HttpStatus.FORBIDDEN
(403):服务器理解请求,但是拒绝执行。HttpStatus.NOT_FOUND
(404):服务器找不到请求的资源。HttpStatus.INTERNAL_SERVER_ERROR
(500):服务器遇到了一个意外的情况,导致无法完成请求。HttpStatus.NOT_IMPLEMENTED
(501):服务器不支持请求的功能,无法完成请求。HttpStatus.SERVICE_UNAVAILABLE
(503):服务器目前无法使用,可能是由于超载或维护。
注意事项
- 使用
HttpStatus
可以更清晰地表达 HTTP 响应的含义。 - Spring 提供了
ResponseEntity
类型,它允许你同时返回 HTTP 状态码和响应体。 - 在处理异常时,可以使用
@ExceptionHandler
注解来捕获异常并返回相应的HttpStatus
。 HttpStatus
枚举类型提供了一个isError()
方法,可以用来检查响应是否表示错误状态。