一、引入相关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 "";
}
}
网友评论