【工具类】Java开发常用Util工具类

没有人挡得住,你疯狂的努力进取。你可以不够强大,但你不能没有梦想。如果你没有梦想,你只能为别人的梦想打工筑路。

导读:本篇文章讲解 【工具类】Java开发常用Util工具类,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

在这里插入图片描述

字符串工具类

StringUtil.java

package com.***.util;

/**
 * StringUtil
 * @description: 字符串工具类
 **/
public class StringUtil {

    /**
     * 判断是否为空字符串最优代码
     * @param str
     * @return 如果为空,则返回true
     */
    public static boolean isEmpty(String str){
        return str == null || str.trim().length() == 0;
    }

    /**
     * 判断字符串是否非空
     * @param str 如果不为空,则返回true
     * @return
     */
    public static boolean isNotEmpty(String str){
        return !isEmpty(str);
    }
}

数据类型转换类

CastUtil.java

package com.***.util;

/**
 * CastUtil
 * @description: 数据转型工具类
 **/
public class CastUtil {
    /** 
    * @Description: 转为String类型
    * @Param: [obj] 
    * @return: java.lang.String 如果参数为null则转为空字符串
    */ 
    public static String castString(Object obj){
        return CastUtil.castString(obj,"");
    }

    /** 
    * @Description: 转为String类型(提供默认值)
    * @Param: [obj, defaultValue] 将obj转为string,如果obj为null则返回default
    * @return: String
    */ 
    public static String castString(Object obj,String defaultValue){
        return obj!=null?String.valueOf(obj):defaultValue;
    }

    /** 
    * @Description: 转为double类型,如果为null或者空字符串或者格式不对则返回0
    * @Param: [obj] 
    * @return: String
    */ 
    public static double castDouble(Object obj){
        return CastUtil.castDouble(obj,0);
    }

    /** 
    * @Description: 转为double类型 ,如果obj为null或者空字符串或者格式不对则返回defaultValue
    * @Param: [obj, defaultValue] 
    * @return: String obj为null或者空字符串或者格式不对返回defaultValue
    */ 
    public static double castDouble(Object obj,double defaultValue){
        double value = defaultValue;  //声明结果,把默认值赋给结果
        if (obj!=null){   //判断是否为null
            String strValue = castString(obj);  //转换为String
            if (StringUtil.isNotEmpty(strValue)){   //判断字符串是否为空(是否为空只能判断字符串,不能判断Object)
                try{
                    value = Double.parseDouble(strValue);  //不为空则把值赋给value
                }catch (NumberFormatException e){
                    value = defaultValue;  //格式不对把默认值赋给value
                }

            }
        }
        return value;
    }

    /**
     * 转为long型,如果obj为null或者空字符串或者格式不对则返回0
     * @param obj
     * @return
     */
    public static long castLong(Object obj){
        return CastUtil.castLong(obj,0);
    }

    /**
     * 转为long型(提供默认数值),如果obj为null或者空字符串或者格式不对则返回defaultValue
     * @param obj
     * @param defaultValue
     * @return obj为null或者空字符串或者格式不对返回defaultValue
     */
    public static long castLong(Object obj,long defaultValue){
        long value = defaultValue;  //声明结果,把默认值赋给结果
        if (obj!=null){   //判断是否为null
            String strValue = castString(obj);  //转换为String
            if (StringUtil.isNotEmpty(strValue)){   //判断字符串是否为空(是否为空只能判断字符串,不能判断Object)
                try{
                    value = Long.parseLong(strValue);  //不为空则把值赋给value
                }catch (NumberFormatException e){
                    value = defaultValue;  //格式不对把默认值赋给value
                }

            }
        }
        return value;
    }

    /**
     * 转为int型
     * @param obj
     * @return 如果obj为null或者空字符串或者格式不对则返回0
     */
    public static int castInt(Object obj){
        return CastUtil.castInt(obj,0);
    }

    /**
     * 转为int型(提供默认值)
     * @param obj
     * @param defaultValue
     * @return 如果obj为null或者空字符串或者格式不对则返回defaultValue
     */
    public static int castInt(Object obj,int defaultValue){
        int value = defaultValue;  //声明结果,把默认值赋给结果
        if (obj!=null){   //判断是否为null
            String strValue = castString(obj);  //转换为String
            if (StringUtil.isNotEmpty(strValue)){   //判断字符串是否为空(是否为空只能判断字符串,不能判断Object)
                try{
                    value = Integer.parseInt(strValue);  //不为空则把值赋给value
                }catch (NumberFormatException e){
                    value = defaultValue;  //格式不对把默认值赋给value
                }

            }
        }
        return value;
    }

    /**
     * 转为boolean型,不是true的返回为false
     * @param obj
     * @return
     */
    public static boolean castBoolean(Object obj){
        return CastUtil.castBoolean(obj,false);
    }


    /**
     * 转为boolean型(提供默认值)
     * @param obj
     * @param defaultValue
     * @return
     */
    public static boolean castBoolean(Object obj,boolean defaultValue){
        boolean value = defaultValue;
        if (obj!=null){  //为null则返回默认值
            value = Boolean.parseBoolean(castString(obj));  //底层会把字符串和true对比,所以不用判断是否为空字符串
        }
        return value;
    }
}

集合工具类

CollectionUtil.java

package com.***.util;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import java.util.Collection;
import java.util.Map;

/**
 * CollectionUtil
 * @description: 集合工具类
 **/
public class CollectionUtil {
    /**
     * 判断collection是否为空
     * @param collection
     * @return
     */
    public static boolean isEmpty(Collection<?> collection){
        //return CollectionUtils.isEmpty(collection);
        return collection == null || collection.isEmpty();
    }

    /**
     * 判断Collection是否非空
     * @return
     */
    public static boolean isNotEmpty(Collection<?> collection){
        return !isEmpty(collection);
    }

    /**
     * 判断map是否为空
     * @param map
     * @return
     */
    public static boolean isEmpty(Map<?,?> map){
        //return MapUtils.isEmpty(map);
        return map == null || map.isEmpty();
    }

    /**
     * 判断map是否非
     * @param map
     * @return
     */
    public static boolean isNotEmpty(Map<?,?> map){
        return !isEmpty(map);
    }
}

数组工具类

ArrayUtil.java

/**
 * 数组工具类
 */
public class ArrayUtil {
    /**
     * 判断数组是否为空
     * @param array
     * @return
     */
    public static boolean isNotEmpty(Object[] array){
        return !isEmpty(array);
    }

    /**
     * 判断数组是否非空
     * @param array
     * @return
     */
    public static boolean isEmpty(Object[] array){
        return array==null||array.length==0;
    }
}

差集工具类

 /**
     * 获取差集
     * @param newStrs 新集合: ,分割的字符串,
     *                例如: 1,2,3
     * @param oldStrs 旧集合: ,分割的字符串,
     *                例如: a,2
     * @param differenceSet_new 需要新增的差集:new - old
     *                          例如: [a]
     * @param differenceSet_old 需要删除的差集:old - new
     *                          例如: [1, 3]
     */
    public static void getDifferenceSet(String newStrs, String oldStrs, List differenceSet_new, List differenceSet_old){

        //多数据替换 - 删除&新增,即在新的也在旧的中的不变
        //oldStrs = "1,2,3";
        //newStrs = "a,2";
        //differenceSet_new = new ArrayList(); //新的部分new - old
        //differenceSet_old = new ArrayList(); //旧的部分old - new
        String[] oldArr = StringUtil.isEmpty(oldStrs) ? new String[0] : oldStrs.split(",");
        String[] newArr = StringUtil.isEmpty(newStrs) ? new String[0] : newStrs.split(",");

        for (String old:oldArr){  //遍历旧元素
            if (!Arrays.asList(newArr).contains(old)){  //判断旧元素是否在新集合里面
                differenceSet_old.add(old);
                System.out.println("删除旧元素:"+old);
            }
        }

        for (String n:newArr){  //遍历新元素
            if (!Arrays.asList(oldArr).contains(n)){  //判断新元素是否在旧集合里面
                differenceSet_new.add(n);
                System.out.println("新增新元素:"+n);
            }
        }
    }

调用

String oldStrs = "1,2,3";
String newStrs = "a,2";
List result_add = new ArrayList(); //新的部分new - old
List result_del = new ArrayList(); //旧的部分old - new
getDifferenceSet(newStrs,oldStrs,result_add,result_del);
System.out.println(result_add.toString());
System.out.println(result_del.toString());

Properties文件操作类

PropsUtil.java

package com.***.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * 属性文件工具类
 */
public class PropsUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(PropsUtil.class);

    /**
     * 加载属性文件
     * @param fileName fileName一定要在class下面及java根目录或者resource跟目录下
     * @return
     */
    public static Properties loadProps(String fileName){
        Properties props = new Properties();
        InputStream is = null;
        try {
            //将资源文件加载为流
            is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);            props.load(is);
            if(is==null){
               throw new FileNotFoundException(fileName+"file is not Found");
            }
        } catch (FileNotFoundException e) {
            LOGGER.error("load properties file filure",e);
        }finally {
            if(is !=null){
                try {
                    is.close();
                } catch (IOException e) {
                    LOGGER.error("close input stream failure",e);
                }
            }
        }
        return props;
    }

    /**
     * 获取字符型属性(默认值为空字符串)
     * @param props
     * @param key
     * @return
     */
    public static String getString(Properties props,String key){
        return getString(props,key,"");
    }

    /**
     * 获取字符型属性(可制定默认值)
     * @param props
     * @param key
     * @param defaultValue 当文件中无此key对应的则返回defaultValue
     * @return
     */
    public static String getString(Properties props,String key,String defaultValue){
        String value = defaultValue;
        if (props.containsKey(key)){
            value = props.getProperty(key);
        }
        return value;
    }

    /**
     * 获取数值型属性(默认值为0)
     * @param props
     * @param key
     * @return
     */
    public static int getInt(Properties props,String key){
        return getInt(props,key,0);
    }

    /**
     * 获取数值型属性(可指定默认值)
     * @param props
     * @param key
     * @param defaultValue
     * @return
     */
    public static int getInt(Properties props,String key,int defaultValue){
        int value = defaultValue;
        if (props.containsKey(key)){
            value = CastUtil.castInt(props.getProperty(key));
        }
        return value;
    }

    /**
     * 获取布尔型属性(默认值为false)
     * @param props
     * @param key
     * @return
     */
    public static boolean getBoolean(Properties props,String key){
        return getBoolean(props,key,false);
    }

    /**
     * 获取布尔型属性(可指定默认值)
     * @param props
     * @param key
     * @param defaultValue
     * @return
     */
    public static boolean getBoolean(Properties props,String key,Boolean defaultValue){
        boolean value = defaultValue;
        if (props.containsKey(key)){
            value = CastUtil.castBoolean(props.getProperty(key));
        }
        return value;
    }
}

用到的maven坐标

<!--slf4j-->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.9</version>
</dependency>

常用流操作工具类

StreamUtil.java

public class StreamUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(StreamUtil.class);

    /**
     * 从输入流中获取字符串
     * @param is
     * @return
     */
    public static String getString(InputStream is){
        StringBuilder sb = new StringBuilder();
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            String line;
            while((line=reader.readLine())!=null){
                sb.append(line);
            }
        } catch (IOException e) {
            LOGGER.error("get string failure",e);
            throw new RuntimeException(e);
        }
        return sb.toString();
    }

}

编码工具类

public class CodecUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(CodecUtil.class);

    /**
     * 将URL编码
     */
    public static String encodeURL(String source){
        String target;
        try {
            target = URLEncoder.encode(source,"utf-8");
        } catch (UnsupportedEncodingException e) {
            LOGGER.error("encode url failure",e);
            throw new RuntimeException(e);
            //e.printStackTrace();
        }
        return target;
    }

    /**
     * 将URL解码
     */
    public static String dencodeURL(String source){
        String target;
        try {
            target = URLDecoder.decode(source,"utf-8");
        } catch (UnsupportedEncodingException e) {
            LOGGER.error("encode url failure",e);
            throw new RuntimeException(e);
            //e.printStackTrace();
        }
        return target;
    }
}

Json工具类

package org.smart4j.framework.util;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

/**
 * @program: JsonUtil
 * @description: JSON工具类
 * @author: Created by QiuYu
 * @create: 2018-10-24 15:55
 */

public class JsonUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(JsonUtil.class);

    private static final ObjectMapper OBJECT_MAPPER =new ObjectMapper();

    /**
     * 将POJO转换为JSON
     */
    public static <T> String toJson(T obj){
        String json;
        try {
            json = OBJECT_MAPPER.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            LOGGER.error("convert POJO to JSON failure",e);
            throw new RuntimeException(e);
            //e.printStackTrace();
        }
        return json;
    }

    /**
     * 将JSON转为POJO
     */
    public static <T> T fromJson(String json,Class<T> type){
        T pojo;
        try {
            pojo = OBJECT_MAPPER.readValue(json,type);
        } catch (IOException e) {
            LOGGER.error("convert JSON to POJO failure",e);
            throw new RuntimeException(e);
            //e.printStackTrace();
        }
        return pojo;

    }
}

日期工具类

DataUtil.java

 /**
  * 根据年月获取当月最后一天
  * @param yearmonth yyyy-MM
  * @return yyyy-MM-dd
  * @throws ParseException
  */
 public static String getLastDayOfMonth(String yearmonth) {
     try {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
         Date dd = format.parse(yearmonth);
         Calendar cal = Calendar.getInstance();
         cal.setTime(dd);
         int cc=cal.getActualMaximum(Calendar.DAY_OF_MONTH);
         String result = yearmonth+"-"+cc;
         return result;
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
 }

时间戳工具类

/** 
 * 时间戳转换成日期格式字符串 
 * @param seconds 精确到秒的字符串 
 * @param formatStr 为null时默认yyyy-MM-dd HH:mm:ss
 * @return 返回日期字符串
 */  
public static String timeStamp2Date(String seconds,String format) {  
    if(seconds == null || seconds.isEmpty() || seconds.equals("null")){  
        return "";  
    }
    
    if(format == null || format.isEmpty()){
        format = "yyyy-MM-dd HH:mm:ss";
    }   
    SimpleDateFormat sdf = new SimpleDateFormat(format);
    //Date是精确到毫秒的13位时间戳,所以秒要*1000
    Date date = new Date(Long.valueOf(seconds+"000"));
    String dateString = sdf.format(date);
    return dateString;  
}

/** 
 * 日期格式字符串转换成时间戳 
 * @param date 字符串日期 
 * @param format 默认:yyyy-MM-dd HH:mm:ss 
 * @return 精确到秒的时间戳
 */
public static String date2TimeStamp(String date_str,String format){  
    if(format == null || format.isEmpty()){
        format = "yyyy-MM-dd HH:mm:ss";
    }
    try {  
        SimpleDateFormat sdf = new SimpleDateFormat(format);  
        return String.valueOf(sdf.parse(date_str).getTime()/1000);  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    return "";  
}

/** 
 * 取得当前时间戳(精确到秒) 
 * @return 
 */  
public static String getNowTimeStamp(){  
    long time = System.currentTimeMillis();
    String timestamp = String.valueOf(time/1000);  
    return timestamp;  
}

精度计算工具类

DoubleTool.java

package com.gmtx.system.tools;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @ClassName: DoubleTool
 * @Description: java类精确计算小数
 * double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型,整型地方法适合于货币精度已知的情况,比如12.11+1.10转成1211+110计算,最后再/100即可
 * @author 秋雨
 * 修改历史 
 *  序号------原因------修改人---日期---
 *   1.                               
 *   2.                                
 */
public class DoubleTool implements Serializable {
    private static final long serialVersionUID = -3345205828566485102L;
    //默认除法运算精度
    private static final Integer DEF_DIV_SCALE = 2;

    /**
     * 提供精确的加法运算。
     * @param value1 被加数
     * @param value2 加数
     * @return 两个参数的和
     */
    public static Double add(Double value1, Double value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.add(b2).doubleValue();
    }

    /**
     * 提供精确的减法运算。
     * @param value1 被减数
     * @param value2 减数
     * @return 两个参数的差
     */
    public static double sub(Double value1, Double value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 提供精确的乘法运算。
     * @param value1 被乘数
     * @param value2 乘数
     * @return 两个参数的积
     */
    public static Double mul(Double value1, Double value2) {
        BigDecimal b1 = new BigDecimal(Double.toString(value1));
        BigDecimal b2 = new BigDecimal(Double.toString(value2));
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 提供(相对)精确的除法运算,当发生除不尽的情况时, 精确到小数点以后10位,以后的数字四舍五入。
     * @param dividend 被除数
     * @param divisor  除数
     * @return 两个参数的商
     */
    public static Double divide(Double dividend, Double divisor) {
        return divide(dividend, divisor, DEF_DIV_SCALE);
    }

    /**
     * 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。
     * @param dividend 被除数
     * @param divisor  除数
     * @param scale    表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static Double divide(Double dividend, Double divisor, Integer scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(dividend));
        BigDecimal b2 = new BigDecimal(Double.toString(divisor));
        return b1.divide(b2, scale,RoundingMode.HALF_UP).doubleValue();
    }

    /**
     * 提供指定数值的(精确)小数位四舍五入处理。
     * @param value 需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double value,int scale){
        if(scale<0){
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(value));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one,scale, RoundingMode.HALF_UP).doubleValue();
    }
}

下载文件工具类

/**
 * 下载url的文件到指定文件路径里面,如果文件父文件夹不存在则自动创建
 * url 下载的http地址
 * path 文件存储地址
 * return 如果文件大小大于2k则返回true
 */
public static boolean downloadCreateDir(String url,String path){
    HttpURLConnection connection=null;
    InputStream in = null;
    FileOutputStream o=null;
    try{
        URL httpUrl=new URL(url);
        connection = (HttpURLConnection) httpUrl.openConnection();
        connection.setRequestProperty("accept", "*/*");
        connection.setRequestProperty("Charset", "gbk");
        connection.setRequestProperty("connection", "Keep-Alive");
        connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
        connection.setRequestMethod("GET");
        
        byte[] data=new byte[1024];
        File f=new File(path);
        File parentDir = f.getParentFile();
        if (!parentDir.exists()) {
            parentDir.mkdirs();
        }
        if(connection.getResponseCode() == 200){
            in = connection.getInputStream();
            o=new FileOutputStream(path);
            int n=0;
            while((n=in.read(data))>0){
                o.write(data, 0, n);
                o.flush();
            }
        }
        if(f.length()>2048){  //代表文件大小
            return true;  //如果文件大于2k则返回true
        }
    }catch(Exception ex){
        ex.printStackTrace();
    }finally{
        try{
            if(in != null){
                in.close();
            }
        }catch(IOException ex){
            ex.printStackTrace();
        }
        try{o.close();}catch(Exception ex){}
        try{connection.disconnect();}catch(Exception ex){}
    }
    return false;
}

解压ZIP工具类

package com.***.tools;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

/**
 * 解压zip文件
 */
public final class ZipUtil {
    private static final int buffer = 2048;

    /**
     * 解压Zip文件
     * @param path zip文件目录
     */
    public static void unZip(String path) {
        int count = -1;
        String savepath = "";

        File file = null;
        InputStream is = null;
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;

        savepath = path.substring(0, path.lastIndexOf(".")) + File.separator; // 保存解压文件目录
        new File(savepath).mkdir(); // 创建保存目录
        ZipFile zipFile = null;
        try {
            zipFile = new ZipFile(path,Charset.forName("GBK")); // 解决中文乱码问题
            Enumeration<?> entries = zipFile.entries();  //枚举ZIP中的所有文件

            while (entries.hasMoreElements()) {
                byte buf[] = new byte[buffer];

                ZipEntry entry = (ZipEntry) entries.nextElement();

                String filename = entry.getName();  //获取文件名
                filename = savepath + filename;
                boolean ismkdir = false;
                if (filename.lastIndexOf("/") != -1) { // 检查此文件是否带有文件夹
                    ismkdir = true;
                }

                if (entry.isDirectory()) { // 如果此枚举文件是文件夹则创建,并且遍历下一个
                    file = new File(filename);
                    file.mkdirs();
                    continue;
                }
                file = new File(filename);  //此枚举文件不是目录
                if (!file.exists()) {  //如果文件不存在并且文件带有目录
                    if (ismkdir) {
                        new File(filename.substring(0, filename
                                .lastIndexOf("/"))).mkdirs(); // 先创建目录
                    }
                }
                file.createNewFile(); //再创建文件

                is = zipFile.getInputStream(entry);
                fos = new FileOutputStream(file);
                bos = new BufferedOutputStream(fos, buffer);

                while ((count = is.read(buf)) > -1) {
                    bos.write(buf, 0, count);
                }
                bos.flush();
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } finally {
            try {
                if (bos != null) {
                    bos.close();
                }
                if (fos != null) {
                    fos.close();
                }
                if (is != null) {
                    is.close();
                }
                if (zipFile != null) {
                    zipFile.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

文件编码转码

将GBK编码的文件转为UTF-8编码的文件

经常配合上一个使用,下载的压缩包解压为文件然后解码。

   /**
     * 把GBK文件转为UTF-8
     * 两个参数值可以为同一个路径
     * @param srcFileName 源文件
     * @param destFileName 目标文件
     * @throws IOException
     */
    private static void transferFile(String srcFileName, String destFileName) throws IOException {
        String line_separator = System.getProperty("line.separator"); 
        FileInputStream fis = new FileInputStream(srcFileName);
        StringBuffer content = new StringBuffer();
        DataInputStream in = new DataInputStream(fis);
        BufferedReader d = new BufferedReader(new InputStreamReader(in, "GBK"));  //源文件的编码方式
        String line = null;
        while ((line = d.readLine()) != null)
         content.append(line + line_separator);
        d.close();
        in.close();
        fis.close();
            
        Writer ow = new OutputStreamWriter(new FileOutputStream(destFileName), "utf-8");  //需要转换的编码方式
        ow.write(content.toString());
        ow.close();
    }

打印方法栈

import java.text.MessageFormat;

/**
 * MethodStackUtil
 * @author: 秋雨
 * 2021-07-23 10:04
 **/
public class MethodStackUtil {
    /**
     * 打印全部方法栈
     * 包括
     * java.lang.Thread.getStackTrace() 1,589 <-
     * MethodStackUtil.getStackTrace() 20 <-
     * @return
     */
    public static String getStackTrace() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        if(stackTrace == null) {
            return "no stack...";
        }
        StringBuffer stackTraceSB = new StringBuffer();
        for(StackTraceElement stackTraceElement : stackTrace) {
            if(stackTraceSB.length() > 0) {
                stackTraceSB.append(" <- ");
                stackTraceSB.append(System.getProperty("line.separator"));
            }
            stackTraceSB.append(MessageFormat.format("{0}.{1}() {2}"
                    ,stackTraceElement.getClassName()
                    ,stackTraceElement.getMethodName()
                    ,stackTraceElement.getLineNumber()));
        }
        return stackTraceSB.toString();
    }

    /**
     * 打印方法栈 - 此方法的上层所有调用者
     * 不包括ava.lang.Thread.getStackTrace()和MethodStackUtil.getStackTrace()
     * @return
     */
    public static String getParentStackTrace() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        if(stackTrace == null) {
            return "no stack...";
        }
        StringBuffer stackTraceSB = new StringBuffer();
        String classname = Thread.currentThread().getStackTrace()[1].getClassName();  //静态方法获取类名
        for(StackTraceElement stackTraceElement : stackTrace) {
            if ("getStackTrace".contains(stackTraceElement.getMethodName()) || classname.contains(stackTraceElement.getClassName())){
                continue;
            }
            if(stackTraceSB.length() > 0) {
                stackTraceSB.append(" <- ");
                stackTraceSB.append(System.getProperty("line.separator"));
            }
            stackTraceSB.append(MessageFormat.format("{0}.{1}() {2}"
                    ,stackTraceElement.getClassName()
                    ,stackTraceElement.getMethodName()
                    ,stackTraceElement.getLineNumber()));
        }
        return stackTraceSB.toString();
    }

    /**
     * 打印方法栈 - 只打印指定包名或者类名的下的方法
     * @param packageName 包名 - 打印指定包名下的方法栈 ,可以写包名的一部分或者类名,例如: com.bus
     * @return
     */
    public static String getStackTraceByPackage(String packageName) {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        if(stackTrace == null) {
            return "no stack...";
        }
        StringBuffer stackTraceSB = new StringBuffer();
        for(StackTraceElement stackTraceElement : stackTrace) {
            if (!stackTraceElement.getClassName().contains(packageName)){  //如果类全名不含packageName则不打印
                continue;
            }
            if(stackTraceSB.length() > 0) {
                stackTraceSB.append(" <- ");
                stackTraceSB.append(System.getProperty("line.separator"));
            }
            stackTraceSB.append(MessageFormat.format("{0}.{1}() {2}"
                    ,stackTraceElement.getClassName()
                    ,stackTraceElement.getMethodName()
                    ,stackTraceElement.getLineNumber()));
        }
        return stackTraceSB.toString();
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/132296.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!