Java常用工具类详解:提升开发效率的利器

在Java开发中,合理利用工具类能够显著提升编码效率和代码质量。本文将介绍几个Java程序员不可或缺的常用工具类,涵盖日期处理、字符串操作、集合处理、文件操作等方面,旨在为你的日常开发工作提供实用的参考。废话不多说,上代码!

1. DateUtils - 日期处理工具类

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtils {

    private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    /**
     * 将日期格式化为字符串
     * @param date 日期对象
     * @param format 日期格式,默认为"yyyy-MM-dd HH:mm:ss"
     * @return 格式化后的日期字符串
     */
    public static String format(Date date, String format) {
        if (date == null) {
            return "";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 将字符串解析为日期
     * @param dateStr 日期字符串
     * @param format 字符串格式,默认为"yyyy-MM-dd HH:mm:ss"
     * @return 解析后的日期对象
     * @throws ParseException 解析异常
     */
    public static Date parse(String dateStr, String format) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.parse(dateStr);
    }

    /**
     * 默认格式将日期字符串转换为日期对象
     * @param dateStr 日期字符串
     * @return 解析后的日期对象
     * @throws ParseException 解析异常
     */
    public static Date parseDefault(String dateStr) throws ParseException {
        return parse(dateStr, DEFAULT_DATE_FORMAT);
    }

    // 新增:获取当前日期时间字符串
    public static String getCurrentDateTimeStr() {
        return format(new Date(), DEFAULT_DATE_FORMAT);
    }

    // 新增:计算两个日期之间的天数差
    public static long daysBetween(Date startDate, Date endDate) {
        return ChronoUnit.DAYS.between(startDate.toInstant(), endDate.toInstant());
    }
}

2. StringUtils - 扩展的字符串操作工具类

public class StringUtils {

    /**
     * 判断字符串是否为空或空白字符串
     * @param str 待检查的字符串
     * @return 如果字符串为null或仅包含空白字符,则返回true
     */
    public static boolean isBlank(String str) {
        return str == null || str.trim().isEmpty();
    }

    /**
     * 安全地获取字符串长度,如果字符串为null,则返回0
     * @param str 字符串
     * @return 字符串长度或0
     */
    public static int safeLength(String str) {
        return str != null ? str.length() : 0;
    }

    /**
     * 连接字符串数组,忽略null值
     * @param strs 字符串数组
     * @param delimiter 分隔符
     * @return 连接后的字符串
     */
    public static String joinIgnoreNull(String[] strs, String delimiter) {
        StringBuilder sb = new StringBuilder();
        for (String str : strs) {
            if (str != null) {
                if (sb.length() > 0) {
                    sb.append(delimiter);
                }
                sb.append(str);
            }
        }
        return sb.toString();
    }

    // 新增:重复字符串N次
    public static String repeat(String str, int times) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < times; i++) {
            sb.append(str);
        }
        return sb.toString();
    }

    // 新增:判断字符串是否包含指定字符集合中的任意字符
    public static boolean containsAnyChar(String str, char... chars) {
        for (char c : chars) {
            if (str.indexOf(c) >= 0) {
                return true;
            }
        }
        return false;
    }
}

3. CollectionUtils - 简化的集合操作工具类

import java.util.Collection;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.Set;

public class CollectionUtils {

    /**
     * 安全地转换集合为列表,如果原集合为null,则返回一个空列表
     * @param collection 原集合
     * @param <T> 泛型标记
     * @return 转换后的列表
     */
    public static <T> List<T> toSafeList(Collection<T> collection) {
        return collection != null ? new ArrayList<>(collection) : new ArrayList<>();
    }

    /**
     * 检查Map是否为空或大小为0
     * @param map 待检查的Map
     * @return 如果Map为null或大小为0,则返回true
     */
    public static boolean isEmpty(Map<?, ?> map) {
        return map == null || map.isEmpty();
    }

    /**
     * 获取集合的第一个元素,如果集合为空则返回null
     * @param collection 集合
     * @param <T> 泛型标记
     * @return 集合的第一个元素或null
     */
    public static <T> T getFirst(Collection<T> collection) {
        if (collection != null && !collection.isEmpty()) {
            return collection.iterator().next();
        }
        return null;
    }

    /**
     * 新增:安全获取Map中的值,如果不存在则返回默认值
     */
    public static <K, V> V getOrDefault(Map<K, V> map, K key, V defaultValue) {
        return map != null ? map.getOrDefault(key, defaultValue) : defaultValue;
    }

    /**
     * 新增:合并两个集合,自动去除重复项
     */
    public static <T> List<T> mergeDistinct(List<T> list1, List<T> list2) {
        Set<T> set = new HashSet<>(list1);
        set.addAll(list2);
        return new ArrayList<>(set);
    }
}

4. MathUtils - 数学运算工具类

public class MathUtils {

    /**
     * 安全的除法运算,避免除以零异常
     * @param dividend 被除数
     * @param divisor 除数
     * @return 结果或Double.NaN(如果除数为0)
     */
    public static double safeDivide(double dividend, double divisor) {
        if (divisor == 0) {
            return Double.NaN;
        }
        return dividend / divisor;
    }

    /**
     * 计算平均值,忽略null或非数字值
     * @param numbers 数字数组
     * @return 平均值或Double.NaN(如果数组为空或所有元素都是无效值)
     */
    public static double average(Double... numbers) {
        if (numbers == null || numbers.length == 0) {
            return Double.NaN;
        }
        double sum = 0;
        int count = 0;
        for (Double num : numbers) {
            if (num != null) {
                sum += num;
                count++;
            }
        }
        return count > 0 ? sum / count : Double.NaN;
    }
}

5. FileUtil - 文件操作工具类

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.charset.StandardCharsets;

public class FileUtil {

    /**
     * 读取文件内容为字符串
     * @param filePath 文件路径
     * @return 文件内容或null(如果文件不存在或读取失败)
     */
    public static String readFileAsString(String filePath) {
        try {
            return new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
        } catch (IOException e) {
            return null;
        }
    }

    /**
     * 写入字符串到文件
     * @param content 字符串内容
     * @param filePath 文件路径
     * @return 是否写入成功
     */
    public static boolean writeFileFromString(String content, String filePath) {
        try {
            Files.write(Paths.get(filePath), content.getBytes(StandardCharsets.UTF_8));
            return true;
        } catch (IOException e) {
            return false;
        }
    }
}

6. NetworkUtils - 简单的网络请求工具类

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class NetworkUtils {

    private static final String USER_AGENT = "Mozilla/5.0";

    /**
     * 发送GET请求
     * @param urlStr 请求的URL
     * @return 响应内容或null(如果发生错误)
     */
    public static String sendGetRequest(String urlStr) {
        return sendHttpRequest("GET", urlStr, null, null);
    }

    /**
     * 发送POST请求
     * @param urlStr 请求的URL
     * @param postData POST数据,格式如"name=value&another=value"
     * @return 响应内容或null(如果发生错误)
     */
    public static String sendPostRequest(String urlStr, String postData) {
        return sendHttpRequest("POST", urlStr, postData, null);
    }

    /**
     * 发送带有自定义头的HTTP请求
     * @param method 请求方法(GET, POST等)
     * @param urlStr 请求的URL
     * @param postData POST数据,若method为GET则忽略
     * @param headers 自定义请求头
     * @return 响应内容或null(如果发生错误)
     */
    public static String sendHttpRequest(String method, String urlStr, String postData, Map<String, String> headers) {
        try {
            URL url = new URL(urlStr);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod(method);
            connection.setRequestProperty("User-Agent", USER_AGENT);

            if (headers != null) {
                for (Map.Entry<String, String> entry : headers.entrySet()) {
                    connection.setRequestProperty(entry.getKey(), entry.getValue());
                }
            }

            if ("POST".equalsIgnoreCase(method)) {
                connection.setDoOutput(true);
                try (OutputStream os = connection.getOutputStream()) {
                    byte[] input = postData.getBytes(StandardCharsets.UTF_8);
                    os.write(input, 0, input.length);
                }
            }

            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                return readResponse(connection);
            } else {
                System.out.println("HTTP Error Code : " + responseCode);
                return "Request failed with HTTP error code: " + responseCode;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    private static String readResponse(HttpURLConnection connection) throws IOException {
        StringBuilder response = new StringBuilder();
        try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
        }
        return response.toString();
    }

    // 示例:如何设置请求头
    public static void exampleSetHeaders() {
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        headers.put("Authorization", "Bearer your_token_here");
        String response = sendHttpRequest("GET", "http://example.com/api/data", null, headers);
        System.out.println(response);
    }
}

7. JsonUtils - JSON处理工具类

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;

public class JsonUtils {

    private static final Gson gson = new GsonBuilder().create();

    /**
     * 将Java对象转换为JSON字符串
     * @param obj 对象实例
     * @return JSON字符串
     */
    public static String toJson(Object obj) {
        return gson.toJson(obj);
    }

    /**
     * 将JSON字符串转换为指定类型的Java对象
     * @param json JSON字符串
     * @param clazz 目标类型
     * @param <T> 泛型标记
     * @return 转换后的对象实例
     */
    public static <T> T fromJson(String json, Class<T> clazz) {
        return gson.fromJson(json, clazz);
    }

    /**
     * 解析JSON字符串为JsonElement
     * @param jsonString JSON字符串
     * @return JsonElement
     */
    public static JsonElement parseToJsonElement(String jsonString) {
        return JsonParser.parseString(jsonString);
    }
}

8. ThreadPoolUtils - 简易线程池管理工具类

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class ThreadPoolUtils {

    private static ExecutorService executor;

    private ThreadPoolUtils() {}

    /**
     * 初始化固定大小的线程池
     * @param poolSize 线程池大小
     */
    public static synchronized void initThreadPool(int poolSize) {
        if (executor == null) {
            executor = Executors.newFixedThreadPool(poolSize);
        }
    }

    /**
     * 提交任务到线程池执行
     * @param task 任务
     */
    public static void execute(Runnable task) {
        if (executor != null && !executor.isShutdown()) {
            executor.execute(task);
        } else {
            throw new IllegalStateException("ThreadPool not initialized or shut down.");
        }
    }

    /**
     * 关闭线程池
     */
    public static void shutdownThreadPool() {
        if (executor != null && !executor.isShutdown()) {
            ((ThreadPoolExecutor) executor).shutdown();
        }
    }
}

9. LogUtils - 日志记录工具类

import java.text.SimpleDateFormat;
import java.util.Date;

public class LogUtils {

    private static final String LOG_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";

    private LogUtils() {}

    public static void info(String message) {
        log("INFO", message);
    }

    public static void debug(String message) {
        log("DEBUG", message);
    }

    public static void warn(String message) {
        log("WARN", message);
    }

    public static void error(String message) {
        log("ERROR", message);
    }

    public static void fatal(String message) {
        log("FATAL", message);
    }

    private static void log(String level, String message) {
        SimpleDateFormat sdf = new SimpleDateFormat(LOG_DATE_FORMAT);
        String timestamp = sdf.format(new Date());
        System.out.printf("[%s] [%s] %s%n", timestamp, level, message);
    }
}

10. CryptoUtils - 加密解密工具类

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Base64;

public class CryptoUtils {

    private static final String ALGORITHM = "AES";
    private static final byte[] keyValue = 
        new byte[]{'T', 'h', 'i', 's', 'I', 's', 'A', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y'};

    /**
    * 使用AES算法对给定的字符串进行加密,并返回Base64编码的加密结果字符串
    */
    public static String encrypt(String valueToEnc) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGORITHM);
        c.init(Cipher.ENCRYPT_MODE, key);
        byte[] encValue = c.doFinal(valueToEnc.getBytes());
        return Base64.getEncoder().encodeToString(encValue);
    }

    /**
    * 接受一个Base64编码的加密字符串,使用AES算法解密并返回原始字符串
    */
    public static String decrypt(String encryptedValue) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGORITHM);
        c.init(Cipher.DECRYPT_MODE, key);
        byte[] decordedValue = Base64.getDecoder().decode(encryptedValue);
        byte[] decValue = c.doFinal(decordedValue);
        return new String(decValue);
    }

    /**
    * 生成AES加密所需的密钥
    */
    private static Key generateKey() throws Exception {
        return new SecretKeySpec(keyValue, ALGORITHM);
    }

    /**
    * 将十六进制字符串转换为字节数组
    */
    public static byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
        }
        return data;
    }

    /**
    * 将字节数组转换为十六进制字符串
    */
    public static String byteArrayToHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
}

11. SysPropUtils - 系统属性操作工具类

public class SysPropUtils {

    /**
    * 获取指定名称的系统属性值
    */
    public static String getProperty(String propName) {
        return System.getProperty(propName);
    }

    /**
    * 设置或修改系统属性值
    */
    public static void setProperty(String propName, String propValue) {
        System.setProperty(propName, propValue);
    }

    /**
    * 检查是否存在指定名称的系统属性
    */
    public static boolean hasProperty(String propName) {
        return System.getProperties().containsKey(propName);
    }

    /**
    * 移除指定名称的系统属性
    */
    public static void removeProperty(String propName) {
        System.clearProperty(propName);
    }

    /**
    * 获取所有系统属性的映射
    */
    public static Map<String, String> getAllProperties() {
        return System.getProperties().entrySet().stream()
                .collect(Collectors.toMap(
                        e -> e.getKey().toString(),
                        e -> e.getValue().toString()));
    }
}

12. ReflectionUtils - 反射操作工具类

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class ReflectionUtils {

    /**
    * 通过反射获取对象中指定字段的值
    */
    public static Object getField(Object obj, String fieldName) throws Exception {
        Field field = obj.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        return field.get(obj);
    }

    /**
    * 通过反射设置对象中指定字段的值
    */
    public static void setField(Object obj, String fieldName, Object fieldValue) throws Exception {
        Field field = obj.getClass().getDeclaredField(fieldName);
        field.setAccessible(true);
        field.set(obj, fieldValue);
    }

    /**
    * 通过反射获取类中指定方法的方法对象
    */
    public static Method getMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes) throws NoSuchMethodException {
        return clazz.getMethod(methodName, parameterTypes);
    }

    /**
    * 通过反射调用对象上的方法,并传递参数
    */
    public static Object invokeMethod(Object obj, String methodName, Object... args) throws Exception {
        Class<?>[] argTypes = Arrays.stream(args).map(Object::getClass).toArray(Class<?>[]::new);
        Method method = obj.getClass().getMethod(methodName, argTypes);
        return method.invoke(obj, args);
    }

    /**
    * 根据类名字符串加载对应的Class对象
    */
    public static Class<?> getClassByName(String className) throws ClassNotFoundException {
        return Class.forName(className);
    }
}

以上示例涵盖了工作中常见的工具类,可以直接在项目中引用,根据需要进行调用,以提高开发效率并保证代码的健壮性。希望对你有帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值