IO工具类

作者: 爪哇驿站 | 来源:发表于2021-01-29 17:10 被阅读0次
一、引入相关jar
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.8.1</version>
</dependency>
二、IoUtil
import org.apache.commons.lang3.StringUtils;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * IO工具类
 *
 * @author: liudong
 * @date: 2021/1/20
 */
public class IoUtil {
    /**
     * 获取文件写入流
     *
     * @param filePath    文件路径
     * @param charsetName 文件编码
     * @return
     */
    public static BufferedWriter getWriter(String filePath, String charsetName) {
        return getWriter(filePath, null, charsetName, null);
    }

    /**
     * 获取单行报表记录
     *
     * @param obj
     * @param separator
     * @param lineEndMark    单行结束符
     * @param fieldTwoDimAry
     * @return
     */
    public static String getLineData(Object obj, String separator, String lineEndMark, String[][] fieldTwoDimAry) {
        return getLineData(null, obj, separator, false, false, lineEndMark, fieldTwoDimAry, null);
    }

    /**
     * 获取文件写入流
     *
     * @param filePath    文件路径
     * @param fileContent 写入内容
     * @param charsetName 文件编码
     * @param lineEndMark 单行结束符
     * @return BufferedWriter对象
     */
    public static BufferedWriter getWriter(String filePath, String fileContent, String charsetName, String lineEndMark) {
        try {
            String parentPath = new File(filePath).getParent();
            File dir = new File(parentPath);
            if (dir == null || !dir.exists() || dir.isDirectory()) {
                dir.mkdirs();
            }
            File file = new File(filePath);
            if (!file.exists()) {
                file.createNewFile();
            }
            if (StringUtils.isEmpty(fileContent))
                return new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), charsetName));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), charsetName));
            bw.write(fileContent + lineEndMark);
            return bw;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取单行报表记录
     *
     * @param obj            数据源对象
     * @param tag            标签
     * @param separator      分隔符
     * @param isTrim         字符串类型是否需要去空格
     * @param isExcludeNull  字符串类型是否需要去null
     * @param fieldTwoDimAry 字段二维数组包含字段长度
     * @param fieldOneDimAry 字段一维数组不包含字段长度
     * @param lineEndMark    单行结束符
     * @return
     * @throws IntrospectionException
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    public static String getLineData(String tag, Object obj, String separator, boolean isTrim, boolean isExcludeNull, String lineEndMark, String[][] fieldTwoDimAry, String... fieldOneDimAry) {
        StringBuilder sb = new StringBuilder();
        if (StringUtils.isNotEmpty(tag)) {
            sb.append("<" + tag + ">");
        }
        try {
            Class clazz = obj.getClass();
            Field[] fields = clazz.getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                String fieldLineStr = humpToLine(fields[i].getName());
                if ((fieldTwoDimAry != null && !contains(fieldTwoDimAry, fieldLineStr)) || (fieldOneDimAry != null && !Arrays.asList(fieldOneDimAry).contains(fieldLineStr)))
                    continue;
                Method method = new PropertyDescriptor(fields[i].getName(), clazz).getReadMethod();
                Object fieldValue = method.invoke(obj);
                if (fields[i].getType() == Date.class) {
                    fieldValue = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(fieldValue);
                }
                if (isTrim) {
                    if (fields[i].getType() == String.class && fieldValue != null) {
                        fieldValue = String.valueOf(method.invoke(obj)).trim();
                    }
                }
                if (isExcludeNull) {
                    if (fieldValue == null) {
                        fieldValue = "";
                    }
                }
                if (fieldTwoDimAry != null && contains(fieldTwoDimAry, fieldLineStr)) {
                    if (StringUtils.isNotEmpty(getFieldLength(fieldTwoDimAry, fieldLineStr))) {
                        fieldValue = String.format("%1$-" + getFieldLength(fieldTwoDimAry, fieldLineStr) + "s", fieldValue);
                    }
                }
                sb.append(fieldValue).append(separator);
            }
            if (StringUtils.isEmpty(sb.toString())) {
                return "";
            }
            sb.deleteCharAt(sb.length() - 1);
        } catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException(e);
        }
        if (StringUtils.isNotEmpty(tag)) {
            sb.append("</" + tag + ">");
        }
        sb.append(lineEndMark);
        return sb.toString();
    }

    /**
     * 获取文件输出流
     *
     * @param filePath    文件路径
     * @param charsetName 文件编码
     * @return
     */
    public static BufferedReader getReader(String filePath, String charsetName) {
        try {
            return new BufferedReader(new InputStreamReader(new FileInputStream(filePath), charsetName));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 向文件末尾追加内容
     *
     * @param filePath 文件路径
     * @param content  追加内容
     */
    public static void fileAppend(String filePath, String content) {
        RandomAccessFile randomFile = null;
        try {
            // 打开一个随机访问文件流,按读写方式
            randomFile = new RandomAccessFile(filePath, "rw");
            // 文件长度,字节数
            long fileLength = randomFile.length();
            //将写文件指针移到文件尾。
            randomFile.seek(fileLength);
            randomFile.writeBytes(content);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (randomFile != null)
                    randomFile.close();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }

    }

    /**
     * 下划线转驼峰
     *
     * @param str
     * @return
     */
    private static String lineToHump(String str) {
        Pattern linePattern = Pattern.compile("_(\\w)");
        str = str.toLowerCase();
        Matcher matcher = linePattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
        }
        matcher.appendTail(sb);
        return sb.toString();
    }

    /**
     * 驼峰转下划线
     *
     * @param str
     * @return
     */
    private static String humpToLine(String str) {
        Pattern humpPattern = Pattern.compile("[A-Z]");
        Matcher matcher = humpPattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
        }
        matcher.appendTail(sb);
        return sb.toString();
    }

    /**
     * 判断二维数组是否包含目标字段
     *
     * @param ary
     * @param target
     * @return
     */
    private static boolean contains(String[][] ary, String target) {
        if (StringUtils.isEmpty(target) || (ary == null || ary.length == 0) || (ary.length == 1 && ary[0].length == 0)) {
            return false;
        }
        for (int i = 0; i < ary.length; i++) {
            for (int j = 0; j < ary[i].length; j++) {
                if (target.equals(ary[i][j])) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 根据字段名称获取字段长度
     *
     * @param ary
     * @param fieldName
     * @return
     */
    private static String getFieldLength(String[][] ary, String fieldName) {
        if (StringUtils.isEmpty(fieldName) || (ary == null || ary.length == 0) || (ary.length == 1 && ary[0].length == 0)) {
            return "";
        }
        for (int i = 0; i < ary.length; i++) {
            for (int j = 0; j < ary[i].length; j++) {
                if (fieldName.equals(ary[i][j])) {
                    return ary[i][j + 1];
                }
            }
        }
        return "";
    }

}

相关文章

网友评论

    本文标题:IO工具类

    本文链接:https://www.haomeiwen.com/subject/iitctltx.html