From 0dc13a6aa1f7ffdb410f022f0b963208a9ad8fed Mon Sep 17 00:00:00 2001 From: yexuejc <1107047387@qq.com> Date: Thu, 8 Jun 2023 16:11:04 +0800 Subject: [PATCH] 1.5.1-jre11 --- UPDATE.md | 14 +++++ pom.xml | 2 +- .../{CsvHeader.java => CsvToBean.java} | 14 ++++- .../java/com/yexuejc/base/pojo/CsvToBean.java | 61 ++++++++++++++++++ .../com/yexuejc/base/pojo/ReadFileBean.java | 38 +++++++++++ .../java/com/yexuejc/base/util/FileUtil.java | 63 +++++++++++++------ 6 files changed, 169 insertions(+), 23 deletions(-) rename src/main/java/com/yexuejc/base/annotation/{CsvHeader.java => CsvToBean.java} (54%) create mode 100644 src/main/java/com/yexuejc/base/pojo/CsvToBean.java diff --git a/UPDATE.md b/UPDATE.md index 9a818eb..15e3bc3 100644 --- a/UPDATE.md +++ b/UPDATE.md @@ -1,6 +1,20 @@ yexuejc-base 更新记录 ------------------ +#### version :1.5.1-jre11 +**time:2023-6-8 16:02:56**
+**branch:** jre11
+**update:**
+1. FileUtil 增加读取csv文件(分页读取) + 提供读取IO流方法合集 +2. 增加AES加解密 +3. 增加文件压缩ZipUtil +4. DateUtil,DateTimeUtil 时间操作工具优化 +5. JsonUtil [feat] 增加json化时对LocalDateTime,LocalDate,Timestamp时间的优化,增加特殊场景序列化反序列化 + + + +--- #### version :1.5.0-jre8 **time:2022-5-9 13:37:31**
**branch:** master
diff --git a/pom.xml b/pom.xml index 1b99f57..b05bdcf 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ top.yexuejc yexuejc-base - 1.5.2-jdk11 + 1.5.1-jre11 yexuejc-base https://github.com/yexuejc/yexuejc-base diff --git a/src/main/java/com/yexuejc/base/annotation/CsvHeader.java b/src/main/java/com/yexuejc/base/annotation/CsvToBean.java similarity index 54% rename from src/main/java/com/yexuejc/base/annotation/CsvHeader.java rename to src/main/java/com/yexuejc/base/annotation/CsvToBean.java index 30ff72c..dfa5055 100644 --- a/src/main/java/com/yexuejc/base/annotation/CsvHeader.java +++ b/src/main/java/com/yexuejc/base/annotation/CsvToBean.java @@ -11,11 +11,21 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited -public @interface CsvHeader { +public @interface CsvToBean { /** * 在类头上设置csv格式的header - * @return + * csv文件和java bean的映射 */ String header(); + + /** + * csv文件的分割符号 + */ + char delimiter() default ','; + + /** + * CSV文件是否有header + */ + boolean hasHeader() default false; } diff --git a/src/main/java/com/yexuejc/base/pojo/CsvToBean.java b/src/main/java/com/yexuejc/base/pojo/CsvToBean.java new file mode 100644 index 0000000..457d2af --- /dev/null +++ b/src/main/java/com/yexuejc/base/pojo/CsvToBean.java @@ -0,0 +1,61 @@ +package com.yexuejc.base.pojo; + +/** + * {@link com.yexuejc.base.annotation.CsvToBean} + * 读取csv文件用 + * @author yexuejc + * @class-name CsvToBean + * @description + * @date 2023/6/6 18:15 + */ +public class CsvToBean { + + /** + * 在类头上设置csv格式的header + * csv文件和java bean的映射 + */ + private String header; + + /** + * csv文件的分割符号 + */ + private char delimiter; + + /** + * CSV文件是否有header + */ + private boolean hasHeader; + + public CsvToBean(String header, char delimiter, boolean hasHeader) { + this.header = header; + this.delimiter = delimiter; + this.hasHeader = hasHeader; + } + + public String getHeader() { + return header; + } + + public CsvToBean setHeader(String header) { + this.header = header; + return this; + } + + public char getDelimiter() { + return delimiter; + } + + public CsvToBean setDelimiter(char delimiter) { + this.delimiter = delimiter; + return this; + } + + public boolean isHasHeader() { + return hasHeader; + } + + public CsvToBean setHasHeader(boolean hasHeader) { + this.hasHeader = hasHeader; + return this; + } +} diff --git a/src/main/java/com/yexuejc/base/pojo/ReadFileBean.java b/src/main/java/com/yexuejc/base/pojo/ReadFileBean.java index 314a96c..98e6667 100644 --- a/src/main/java/com/yexuejc/base/pojo/ReadFileBean.java +++ b/src/main/java/com/yexuejc/base/pojo/ReadFileBean.java @@ -1,6 +1,11 @@ package com.yexuejc.base.pojo; +import org.checkerframework.checker.units.qual.C; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.function.Function; /** * @author maxf @@ -34,7 +39,18 @@ public class ReadFileBean { * 文件的length */ private long fileLength; + /** + * csv文件存在header + */ + private String header; + private Charset readCharset = StandardCharsets.UTF_8; + public Function lineScavenger = t -> t; + public ReadFileBean() { + this.readRowNum = Integer.MAX_VALUE; + this.startRowNum = 1; + this.endRowNum = 0; + } public ReadFileBean(int readRow) { this.readRowNum = readRow; @@ -42,6 +58,24 @@ public class ReadFileBean { this.endRowNum = 0; } + public Charset getReadCharset() { + return readCharset; + } + + public ReadFileBean setReadCharset(Charset readCharset) { + this.readCharset = readCharset; + return this; + } + + public String getHeader() { + return header; + } + + public ReadFileBean setHeader(String header) { + this.header = header; + return this; + } + public int getReadRowNum() { return readRowNum; } @@ -82,4 +116,8 @@ public class ReadFileBean { this.fileLength = fileLength; return this; } + + public String lineScavenge(String lineData) { + return this.lineScavenger.apply(lineData); + } } diff --git a/src/main/java/com/yexuejc/base/util/FileUtil.java b/src/main/java/com/yexuejc/base/util/FileUtil.java index f0d351e..a5bbb37 100644 --- a/src/main/java/com/yexuejc/base/util/FileUtil.java +++ b/src/main/java/com/yexuejc/base/util/FileUtil.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.dataformat.csv.CsvMapper; import com.fasterxml.jackson.dataformat.csv.CsvSchema; import com.google.common.io.ByteStreams; import com.google.common.io.CharStreams; -import com.yexuejc.base.annotation.CsvHeader; +import com.yexuejc.base.annotation.CsvToBean; import com.yexuejc.base.pojo.ReadFileBean; import io.jsonwebtoken.lang.Assert; import org.apache.commons.io.IOUtils; @@ -28,7 +28,6 @@ import java.math.BigInteger; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.security.MessageDigest; @@ -52,7 +51,7 @@ import java.util.zip.CRC32; public class FileUtil { static Logger logger = Logger.getLogger(FileUtil.class.getName()); - private FileUtil() { + public FileUtil() { } private static final String TYPE_TAR_GZ = ".tar.gz"; @@ -491,24 +490,48 @@ public class FileUtil { * @param 读取结果类型bean * @return */ - public ReadFileBean readBigFile(String path, ReadFileBean readFileBean, Class readCls) { + public ReadFileBean readBigFile(String path, ReadFileBean readFileBean, Class readCls) throws FileNotFoundException { File file = new File(path); - judeFileExists(file); - try { - RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r"); + if (!file.exists() || file.isDirectory()) { + throw new FileNotFoundException("file:" + path + " is not found."); + } + try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r")) { + if (readFileBean.getPointer() < 0) { + readFileBean.setPointer(0); + } randomAccessFile.seek(readFileBean.getPointer()); readFileBean.setFileLength(randomAccessFile.length()); List datas = new ArrayList<>(); - for (int i = 0; i < readFileBean.getReadRowNum(); i++) { - String s = randomAccessFile.readLine(); - datas.add(charsetDecode(s, StandardCharsets.UTF_8)); + int row = 1; + String line; + while ((line = randomAccessFile.readLine()) != null && row < readFileBean.getReadRowNum()) { + row++; readFileBean.setPointer(randomAccessFile.getFilePointer()); + datas.add(readFileBean.lineScavenge(charsetDecode(line, readFileBean.getReadCharset()))); } + + if (StrUtil.isEmpty(datas)) { + //无数据 + return readFileBean.setDatas(List.of()); } - randomAccessFile.close(); if (path.contains(TYPE_CSV)) { //csv文件处理 - datas.add(0, getCsvHeader(readCls)); - List dataList = readCsv(String.join("\n", datas), readCls, ','); + com.yexuejc.base.pojo.CsvToBean csvToBean = getCsvToBean(readCls); + readFileBean.setHeader(csvToBean.getHeader()); + if (csvToBean.isHasHeader()) { + //文件存在header,设置header优先,没设置使用文件的 + if (StrUtil.isNotEmpty(csvToBean.getHeader())) { + //替换header + datas.remove(0); + datas.add(0, csvToBean.getHeader()); + } else { + readFileBean.setHeader(datas.get(0)); + } + } else { + //文件不存在header,使用设置的 + datas.add(0, csvToBean.getHeader()); + } + + List dataList = readCsv(String.join("\n", datas), readCls, csvToBean.getDelimiter()); readFileBean.setDatas(dataList); } } catch (FileNotFoundException e) { @@ -520,18 +543,18 @@ public class FileUtil { } /** - * 获取csv的header,使用注解{@link CsvHeader} + * 获取csv的header,使用注解{@link CsvToBean} * * @param cls * @param * @return */ - public static String getCsvHeader(Class cls) { - CsvHeader annotation = cls.getAnnotation(CsvHeader.class); - Assert.notNull(annotation, cls.toString() + "类上需要添加注解@CsvHeader,并指定header。"); - String header = annotation.header(); - Assert.notNull(header, cls.toString() + "类上需要添加注解@CsvHeader,并指定header。"); - return header; + public static com.yexuejc.base.pojo.CsvToBean getCsvToBean(Class cls) { + CsvToBean annotation = cls.getAnnotation(CsvToBean.class); + Assert.notNull(annotation, cls.toString() + "类上需要添加注解@CsvToBean,并指定header。"); + com.yexuejc.base.pojo.CsvToBean csvToBean = new com.yexuejc.base.pojo.CsvToBean( + annotation.header(), annotation.delimiter(), annotation.hasHeader()); + return csvToBean; } /**