可以提高 Java 代码开发效率的工具类(持续更新)

       

目录

Collections

排序:

洗牌:

反转:

二分搜索:

最大/最小值:

替换元素:

同步控制:

不可变视图:

空集合:

频率统计:

CollectionUtils

1.isEmpty 和 isNotEmpty:用于检查集合是否为空。

2.union:获取两个集合的并集

3.intersection:获取两个集合的交集。

4.disjunction:获取两个集合的交集的补集

5.subtract:获取两个集合的差集。

6.containsAny:判断一个集合是否包含另一个集合中的任意元素。

7.transform:对集合中的每个元素应用转换函数。

8.find:查找集合中满足特定条件的第一个元素。

Lists

添加依赖

创建新的ArrayList

分区列表

反转列表

转换列表

字符列表

创建不可变列表

创建线程安全的列表

创建链表

列表差集

列表子集

Objects

equals

hashCode

toString

比较

非空检查

检查元素索引

类型检查

组合哈希码

BooleanUtils

逻辑运算

布尔值判断

布尔值转换

字符串转换

整数转换

字符串表示

比较

默认值

StringUtils

Assert

断言参数是否为空

断言集合是否为空

断言条件是否为空

IOUtils

关闭对象

比较文件内容

拷贝文件内容

行迭代器

将数据转换为流

将流转换为数据

将数据写入文件

将多行文本写入文件

读取行(将文件中的内容一行一行读出来)

读取文件中的二进制数据(图片或文件)

读取指定长度的二进制数据

跳过输入流中的指定数量的字节

ClassUtils

返回指定类的包名

返回类的简单名称(不包括包名)

返回类的规范化全名(包括包名和简单类名)

返回类的简单名称

检查类是否是 Java 基本数据类型

检查类是否是 Java 基本数据类型的包装类

检查是否可以将一个类的对象分配给另一个类的引用

检查是否可以将一个值赋给指定类型的引用

将类名的列表转换为 Class 对象的列表

将 Class 对象的集合转换为类名的列表

返回指定类的所有父类

返回类及其父类实现的所有接口

检查指定的类是否是内部类

返回类的缩写名称

BeanUtils

拷贝对象的属性值

设置对象的属性值

获取对象的属性值

浅拷贝对象

将 Map 数据封装到指定的 JavaBean

返回对象的 JavaBean 属性描述符的 Map

返回类的 JavaBean 属性描述符数组

判断类是否是一个简单的 JavaBean 属性类型

获取指定属性描述符所描述的属性的简单类型

获取对象的属性值

设置对象的属性值

ImageIO

读取图片

写入图片:

获取图片格式:


        文中并没有给出工具类所有的方法,只是抛砖引玉,提出几个比较常用的方法。

Collections

        Collections 类是 Java 中的一个工具类,它包含了一系列静态方法,用于对集合进行操作。这个类位于 java.util 包中。以下是一些常用的 Collections 类方法:

  1. 排序:

    • sort(List<?> list): 对指定的列表按自然顺序进行排序。
    • sort(List<?> list, Comparator<? super T> c): 按指定的比较器对列表进行排序。
  2. 洗牌:

    • shuffle(List<?> list): 使用默认的随机源对列表进行随机洗牌。
    • shuffle(List<?> list, Random rnd): 使用指定的随机源对列表进行随机洗牌。
  3. 反转:

    • reverse(List<?> list): 反转列表的顺序。
  4. 二分搜索:

    • binarySearch(List<? extends T> list, T key): 在自然排序的列表中进行二分查找。
    • binarySearch(List<? extends T> list, T key, Comparator<? super T> c): 在按比较器排序的列表中进行二分查找。
  5. 最大/最小值:

    • max(Collection<? extends T> coll): 返回集合中的最大元素。
    • min(Collection<? extends T> coll): 返回集合中的最小元素。
  6. 替换元素:

    • replaceAll(List<?> list, Object oldVal, Object newVal): 将列表中所有旧值替换为新值。
  7. 同步控制:

    • synchronizedList(List<T> list): 返回一个线程安全的列表。
    • synchronizedMap(Map<K,V> m): 返回一个线程安全的映射。
    • synchronizedSet(Set<T> s): 返回一个线程安全的集合。
  8. 不可变视图:

    • unmodifiableList(List<? extends T> list): 返回一个不可修改的列表视图。
    • unmodifiableMap(Map<? extends K,? extends V> m): 返回一个不可修改的映射视图。
    • unmodifiableSet(Set<? extends T> s): 返回一个不可修改的集合视图。
  9. 空集合:

    • emptyList(): 返回一个空的不可修改的列表。
    • emptyMap(): 返回一个空的不可修改的映射。
    • emptySet(): 返回一个空的不可修改的集合。
  10. 频率统计:

    • 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 工具类也非常常用。目前比较主流的是springorg.springframework.util包下的CollectionUtils工具类和apacheorg.apache.commons.collections包下的CollectionUtils 工具类。

        我个人更推荐使用apache的包下的CollectionUtils工具类,因为它的工具更多更全面。

以下是一些常用的 CollectionUtils 方法:

1.isEmptyisNotEmpty:用于检查集合是否为空。

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 类的使用方式:

  1. 创建新的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
  2. 分区列表

    • Lists.partition(List list, int size): 将一个列表均匀地划分为多个子列表。
  3. 反转列表

    • Lists.reverse(List list): 反转列表的顺序。
  4. 转换列表

    • Lists.transform(List list, Function function): 对列表中的每个元素应用一个函数,并返回一个新的列表。
  5. 字符列表

    • Lists.charactersOf(String string): 将字符串转换为字符的列表。
  6. 创建不可变列表

    • Lists.asList(E first, E[] rest): 创建一个不可变的列表,包含第一个元素和数组中的元素。
    • Lists.asList(E first, E second, E[] rest): 创建一个不可变的列表,包含前两个元素和数组中的元素。
  7. 创建线程安全的列表

    • Lists.newCopyOnWriteArrayList(): 创建一个空的线程安全的 CopyOnWriteArrayList
    • Lists.newCopyOnWriteArrayList(Iterable<? extends E> elements): 根据给定的元素创建一个线程安全的 CopyOnWriteArrayList
  8. 创建链表

    • Lists.newLinkedList(): 创建一个空的 LinkedList
    • Lists.newLinkedList(Iterable<? extends E> elements): 根据给定的元素创建一个 LinkedList
  9. 列表差集

    • Lists.setDifference(List<?> list1, List<?> list2): 返回两个列表的差集。
  10. 列表子集

    • Lists.subList(List<?> list, int fromIndex, int toIndex): 返回列表的子集(注意这是 List 接口的方法,不是 Guava 特有的)。

Objects

        Java标准库中的java.util.Objects类是在Java 7中引入的,它提供了一些实用的方法来操作和比较对象。以下是一些常用的Objects类方法:

  1. equals

    • Objects.equals(Object a, Object b): 比较两个对象是否相等。这个方法是equals方法的简化形式,可以替代(a == b) || (a != null && a.equals(b))
  2. hashCode

    • Objects.hashCode(Object o): 返回对象的hashCode值,如果对象为null,则返回0。
  3. toString

    • Objects.toString(Object o): 返回对象的String表示,如果对象为null,则返回字符串"null"。
    • Objects.toString(Object o, String nullDefault): 返回对象的String表示,如果对象为null,则返回提供的默认值。
  4. 比较

    • Objects.compare(T a, T b): 使用自然顺序比较两个对象,如果a小于b返回负数,如果a等于b返回0,如果a大于b返回正数。
    • Objects.compare(T a, T b, Comparator<? super T> cmp): 使用提供的Comparator比较两个对象。
  5. 非空检查

    • Objects.requireNonNull(Object obj): 如果对象不是null,则返回对象;如果是null,则抛出NullPointerException
    • Objects.requireNonNull(Object obj, String message): 如果对象不是null,则返回对象;如果是null,则抛出带有自定义消息的NullPointerException
  6. 检查元素索引

    • Objects.checkIndex(int index, int size): 检查索引是否在有效范围内,如果不在,则抛出IndexOutOfBoundsException
    • Objects.checkFromToIndex(int fromIndex, int toIndex, int size): 检查从索引到索引的范围是否有效。
  7. 类型检查

    • Objects.requireNonNullElse(T obj, T defaultObj): 如果对象不是null,则返回对象;如果是null,则返回默认对象。
    • Objects.requireNonNullElseGet(T obj, Supplier<? extends T> defaultSupplier): 如果对象不是null,则返回对象;如果是null,则返回由供应商提供的默认对象。
  8. 组合哈希码

    • Objects.hash(Object... values): 根据一组对象计算出一个哈希码,这个哈希码可以用于hashCode方法的实现。

         java.util.Objects 类的方法通常用于简化常见的对象操作,如比较、哈希码计算和非空检查,使得代码更加简洁和易于维护。

BooleanUtils

        在java中布尔值,随处可见。如果你使用了布尔的包装类:Boolean,总感觉有点麻烦,因为它有三种值:nulltruefalse。我们在处理 Boolean 对象时,需要经常判空。

        头疼!!!

        但如果使用BooleanUtils类处理布尔值,心情一下子就愉悦起来了。

        Apache Commons Lang库中的BooleanUtils类提供了许多用于处理布尔值的实用方法。以下是一些常用的方法:

  1. 逻辑运算

    • and(boolean... array): 对一组布尔值进行逻辑与运算。
    • or(boolean... array): 对一组布尔值进行逻辑或运算。
    • xor(boolean... array): 对一组布尔值进行逻辑异或运算。
  2. 布尔值判断

    • isTrue(Boolean bool): 判断布尔值是否为true
    • isFalse(Boolean bool): 判断布尔值是否为false
    • isNotTrue(Boolean bool): 判断布尔值是否不是true(即为nullfalse)。
    • isNotFalse(Boolean bool): 判断布尔值是否不是false(即为nulltrue)。
  3. 布尔值转换

    • toBoolean(Boolean bool): 将Boolean对象转换为基本数据类型的boolean值。
    • toBooleanObject(int value): 将int值转换为Boolean对象。
    • toBooleanObject(Integer value): 将Integer对象转换为Boolean对象。
  4. 字符串转换

    • toBoolean(String str): 将字符串转换为布尔值。
  5. 整数转换

    • toInteger(boolean bool): 将布尔值转换为整数(true为1,false为0)。
  6. 字符串表示

    • toStringOnOff(boolean bool): 将布尔值转换为"on"或"off"字符串。
    • toStringTrueFalse(Boolean bool): 将布尔值转换为"true"或"false"字符串。
    • toStringYesNo(boolean bool): 将布尔值转换为"yes"或"no"字符串。
  7. 比较

    • compare(boolean x, boolean y): 比较两个布尔值并返回整数值。
  8. 默认值

    • 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 类的一些常用方法:

读取图片

  1. ImageIO.read(InputStream input)

    • 从输入流中读取图片。
    • 返回值:BufferedImage 对象。
  2. ImageIO.read(File input):

    • 从文件中读取图片。
    • 返回值:BufferedImage 对象。

写入图片:

  1. ImageIO.write(RenderedImage im, String formatName, OutputStream output):

    • 将 RenderedImage 对象写入输出流,可以指定图片格式。
    • formatName 参数指定图片的格式,如 "jpg"、"png"。
  2. ImageIO.write(RenderedImage im, String formatName, File output):

    • 将 RenderedImage 对象写入文件,可以指定图片格式。

获取图片格式:

  1. ImageIO.getReaderFormatFileName(String fileName):

    • 根据文件名获取图片的格式。
  2. 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 提供的主要方法有:

  1. encodeToString(byte[] input): 将字节数组编码为 Base64 编码的字符串。

  2. decodeFromString(String input): 将 Base64 编码的字符串解码为原始的字节数组。

  3. encodeUrlSafe(byte[] input): 将字节数组编码为 URL 安全的 Base64 编码字符串。

  4. 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 等。以下是一些常用方法及其代码示例:

常用方法

  1. 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);
    }
}
  1. 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);
    }
}
  1. 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 的常用方法及其代码案例:

常用方法

  1. serialize(Object object):

    • 将给定的对象序列化成字节数组。
  2. deserialize(byte[] bytes):

    • 将字节数组反序列化成对象。
  3. 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() 方法,可以用来检查响应是否表示错误状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小林想被监督学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值