18 Commits

Author SHA1 Message Date
its
1415200b1a [update] JsonUtil 增加objToMap;优化obj2Json
DateUtil 标准化日期时间的转换函数
2024-04-19 20:04:10 +08:00
its
0954eb64b5 [update] FileUtil增加读取大文件自定义方法和单纯读取方法 2024-04-15 18:19:04 +08:00
its
70aad08b97 [update] FileUtil增加读取大文件自定义方法和单纯读取方法 2024-04-15 17:21:39 +08:00
its
59f0e6e296 [update] 1.5.2-jre11 发布 2024-04-08 16:26:04 +08:00
its
8e8f390b5d [update] JwtUtil 升级 2024-04-07 17:30:27 +08:00
its
2031a3aadf [update] 更新文档 2024-04-07 14:45:41 +08:00
its
b6ffffef71 [update] 1.5.2-jre11
1. 升级相关依赖
2. 依赖工具读取文件FileInput从FileUtil中提取出来
2024-04-07 14:37:36 +08:00
601611a11f update README.md.
Signed-off-by: 夜雪剑辰 <1107047387@qq.com>
2024-02-22 11:48:36 +00:00
8d364b99f2 [update] jsonUtil优化
Signed-off-by: 夜雪剑辰 <1107047387@qq.com>
2024-02-22 11:39:48 +00:00
127c6902bf [update] 判断空优化
Signed-off-by: 夜雪剑辰 <1107047387@qq.com>
2024-02-22 11:39:23 +00:00
007d8d2f16 [update] SysUtil 增加JVM内存判断等待锁
Signed-off-by: 夜雪剑辰 <1107047387@qq.com>
2023-12-26 09:40:38 +00:00
41a9f1b507 Merge remote-tracking branch 'origin/jre11' into jre11
# Conflicts:
#	src/main/java/com/yexuejc/base/util/JsonUtil.java
2023-09-20 10:02:40 +08:00
bf731e753a 增加StrUtil.printStackTrace方法:把异常堆栈信息转化为字符串 -> 替代 e.printStackTrace() 2023-09-20 10:01:58 +08:00
8d5e653d2b 增加StrUtil.printStackTrace方法:把异常堆栈信息转化为字符串 -> 替代 e.printStackTrace() 2023-09-20 10:01:27 +08:00
c4fc4bd4f8 [update]FileUtil优化分页读取 2023-07-19 20:14:15 +08:00
yexuejc007
667ad26971 [update] ObjUtil.copy方法优化(即使copy不成功,也不报错,出警告日志)。PR:copy源和目标对象中的属性类型不一致,copy不成功 2023-06-15 14:24:05 +08:00
yexuejc007
a260b41fae Merge remote-tracking branch 'origin/jre11' into jre11 2023-06-13 17:56:08 +08:00
yexuejc007
0754660c45 [feat] ObjUtil 增加对象的深度copy 2023-06-13 17:55:37 +08:00
28 changed files with 1502 additions and 797 deletions

View File

@@ -1,29 +1,15 @@
yexuejc-base 基于jdk8常用工具包
yexuejc-base 基于jdk11常用工具包
----------------------
源码地址:<br>
github:https://github.com/yexuejc/yexuejc-base
gitee:https://gitee.com/jzsw-it/yexuejc-base
### 说明
1. 支持环境java81.5.0开始支持java11请使用`x.x.x-jre11`版本)
1. 支持环境java111.5.0开始支持java11请使用`1.5.x-jre11`版本)
2. 该工具包基于springboot提取按理说适用于所有java工程
3. 其中依赖jjwt相关、validation-api排除请使用
> ```
> <exclusions>
> <exclusion>
> <artifactId>xxx</artifactId>
> <groupId>xxxx</groupId>
> </exclusion>
> </exclusions>
> ```
>
4. `1.1.9` 升级JWT为单例类
5. `1.2.3` 修复RSA加密(签名)Base64Url 问题如需使用RSA请使用1.2.3+
6.`1.3.0`开始,变更组织`groupId``top.yexuejc`。使用者请尽快升级到`1.3.0`以上1.3.0代码向下兼容)
7.`1.5.0`开始,版本分为`1.5.0-jre8``1.5.0-jre11`分别对于jre8和jre11使用
7. `1.5.0`开始,版本分为`1.5.0-jre8``1.5.0-jre11`分别对于jre8和jre11使用后续逐渐放弃jre8
### 使用
>yexuejc.base.version=1.5.0-jre8
pom.xml
```
@@ -31,30 +17,11 @@ pom.xml
<dependency>
<groupId>top.yexuejc</groupId>
<artifactId>yexuejc-base</artifactId>
<version>${yexuejc.base.version}</version>
<version>1.5.2-jre11</version>
</dependency>
</dependencies>
```
#### 附1.3.0之前的使用方式
pom.xml
```
<dependencies>
<dependency>
<groupId>com.yexuejc.base</groupId>
<artifactId>yexuejc-base</artifactId>
<version>1.3.0以下</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>yexuejc-nexus-public</id>
<name>yexuejc-nexus-public</name>
<url>https://nexus.yexuejc.club/repository/maven-public/</url>
</repository>
</repositories>
```
### 工具文档
[Wiki](WIKI.md)

View File

@@ -1,6 +1,26 @@
yexuejc-base 更新记录
------------------
#### version 1.5.3-jre11
**time ** <br/>
**branch** jre11 <br/>
**update** <br/>
1. [FileUtil.java](src/main/java/com/yexuejc/base/util/FileUtil.java)增加读取大文件自定义方法和单纯读取方法
2. JsonUtil 增加objToMap优化obj2Json
3. DateUtil 标准化日期时间的转换函数
---
#### version 1.5.2-jre11
**time2024-4-7 14:34:33** <br/>
**branch** jre11 <br/>
**update** <br/>
1. 升级相关依赖
2. 依赖工具读取文件[FileInput.java](src/main/java/com/yexuejc/base/file/FileInput.java)从[FileUtil.java](src/main/java/com/yexuejc/base/util/FileUtil.java)中提取出来
3. 优化[FileUtil.java](src/main/java/com/yexuejc/base/util/FileUtil.java)
4. 优化[JwtUtil.java](src/main/java/com/yexuejc/base/util/JwtUtil.java)
---
#### version 1.5.1-jre11
**time2023-6-8 16:02:56** <br/>
**branch** jre11 <br/>

31
pom.xml
View File

@@ -6,11 +6,11 @@
<groupId>top.yexuejc</groupId>
<artifactId>yexuejc-base</artifactId>
<version>1.5.1-jre11</version>
<version>1.5.2-jre11</version>
<name>yexuejc-base</name>
<url>https://github.com/yexuejc/yexuejc-base</url>
<description>Common toolkits based on JDK11 packaging</description>
<description>Common toolkits based on JDK11+ packaging</description>
<licenses>
<license>
@@ -42,16 +42,16 @@
<repos.yexuejc.url>https://nexus.yexuejc.top/repository/</repos.yexuejc.url>
<repos.aliyun.url>https://maven.aliyun.com/repository/public</repos.aliyun.url>
<repos.jitpack.url>https://jitpack.io</repos.jitpack.url>
<jjwt.version>0.11.5</jjwt.version>
<jjwt.version>0.12.5</jjwt.version>
<maven.compiler.verbose>true</maven.compiler.verbose>
<java.version>11</java.version>
<validation-api.version>3.0.2</validation-api.version>
<commons-io.version>2.11.0</commons-io.version>
<bcprov-jdk15on.version>1.70</bcprov-jdk15on.version>
<guava.version>31.1-jre</guava.version>
<apache-poi.version>5.2.2</apache-poi.version>
<jackson.version>2.14.2</jackson.version>
<bcprov-jdk18on.version>1.78</bcprov-jdk18on.version>
<guava.version>33.1.0-jre</guava.version>
<apache-poi.version>5.2.5</apache-poi.version>
<jackson.version>2.17.0</jackson.version>
<zip4j.version>2.11.4</zip4j.version>
<!-- 文件拷贝时的编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -93,14 +93,15 @@
<!--支持大量的密码术算法并提供JCE 1.2.1的实现-->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>${bcprov-jdk15on.version}</version>
<artifactId>bcprov-jdk18on</artifactId>
<version>${bcprov-jdk18on.version}</version>
</dependency>
<!--com.yexuejc.base.util.SysUtil.threadRun 异步处理代码-->
<!--com.yexuejc.base.file.FileInput 读文件-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
<optional>true</optional>
</dependency>
<dependency>
@@ -112,6 +113,12 @@
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${apache-poi.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
@@ -145,7 +152,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<version>3.13.0</version>
<configuration>
<encoding>UTF-8</encoding>
<source>11</source>
@@ -156,7 +163,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<version>3.3.1</version>
<executions>
<execution>
<id>attach-sources</id>

View File

@@ -1,6 +1,11 @@
package com.yexuejc.base.annotation;
import java.lang.annotation.*;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 设置csv header

View File

@@ -0,0 +1,38 @@
package com.yexuejc.base.converter;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer;
/**
* 反序列化中内容为空时返回Integer为空
* <p>使用方式:@JsonDeserialize(using = IntegerNullValueDeserializer.class)</p>
* @author: yexuejc
* @date: 2024/4/15 18:08
*/
public class IntegerNullValueDeserializer extends StdScalarDeserializer<Integer> {
public IntegerNullValueDeserializer() {
super(Integer.class);
}
@Override
public Integer deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = p.getValueAsString();
if (isInteger(value)) {
return super._parseInteger(p, ctxt, Integer.class);
} else {
return null;
}
}
private static boolean isInteger(String s) {
try {
Integer.parseInt(s);
return true;
} catch (NumberFormatException e) {
return false;
}
}
}

View File

@@ -1,16 +1,16 @@
package com.yexuejc.base.converter;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.yexuejc.base.constant.DateConsts;
import com.yexuejc.base.util.StrUtil;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
/**
* json转LocalDate
*

View File

@@ -1,13 +1,13 @@
package com.yexuejc.base.converter;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
/**
* localDate转json
*

View File

@@ -1,16 +1,16 @@
package com.yexuejc.base.converter;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.yexuejc.base.constant.DateConsts;
import com.yexuejc.base.util.StrUtil;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
/**
* json转LocalDateTime
*

View File

@@ -17,7 +17,7 @@ import com.fasterxml.jackson.databind.SerializerProvider;
public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
@Override
public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
}
}

View File

@@ -1,11 +1,11 @@
package com.yexuejc.base.converter;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
/**
* <pre>
* json中的“”转String对象时值为null

View File

@@ -1,17 +1,17 @@
package com.yexuejc.base.converter;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.yexuejc.base.constant.DateConsts;
import com.yexuejc.base.util.StrUtil;
import java.io.IOException;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.yexuejc.base.constant.DateConsts;
import com.yexuejc.base.util.StrUtil;
/**
* json转LocalDateTime
*

View File

@@ -1,14 +1,14 @@
package com.yexuejc.base.converter;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.yexuejc.base.constant.DateConsts;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
/**
* Timestamp转json
*

View File

@@ -0,0 +1,254 @@
package com.yexuejc.base.file;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.StringWriter;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.util.Scanner;
import java.util.stream.Collectors;
import org.apache.commons.io.IOUtils;
/**
* 提供读取IO流方法合集
* <p>读取速度快慢顺序:</p>
* 1. {@link #read4Buffer(InputStream, Charset)} <br>
* 2. {@link #read4IOUtilsCopy(InputStream, Charset)} <br>
* 3. {@link #read4ByteStreams(InputStream, Charset)} <br>
* 4. {@link #read4Byte(InputStream, Charset)} <br>
* 5. {@link #read4StringBuilder(InputStream, Charset)} <br>
* 6. {@link #read4BufferedReaderParallel(InputStream, Charset, String)}<br>
* 7. {@link #read4BufferedReader(InputStream, Charset, String)}<br>
* 8. {@link #read4ScannerA(InputStream)}<br>
* 9. {@link #read4BufferIO(InputStream, Charset)}<br>
* 10. {@link #read4IOUtils(InputStream, Charset)}<br>
* 11. {@link #read4ScannerZ(InputStream)}<br>
* 12. {@link #read4CharStreams(InputStream, Charset)}<br>
*/
public class FileInput {
/**
* 读取IO流内容byte方式
*
* @param inputStream
* @param charset 编码:默认 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4Byte(InputStream inputStream, Charset charset) throws IOException {
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
return new String(bytes, charset == null ? Charset.defaultCharset() : charset);
}
/**
* 读取IO流内容BufferedReader方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @param lineSeparator 换行方式:默认跟随系统 {@link System#lineSeparator()}
* @return
*/
public static String read4BufferedReader(InputStream inputStream, Charset charset, String lineSeparator) {
return new BufferedReader(
new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset)
).lines().collect(Collectors.joining(lineSeparator == null ? System.lineSeparator() : lineSeparator));
}
/**
* 读取IO流内容BufferedReader 并行方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @param lineSeparator 换行方式:默认跟随系统 {@link System#lineSeparator()}
* @return
*/
public static String read4BufferedReaderParallel(InputStream inputStream, Charset charset, String lineSeparator) {
return new BufferedReader(
new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset)
).lines().parallel()
.collect(Collectors.joining(lineSeparator == null ? System.lineSeparator() : lineSeparator));
}
/**
* 读取IO流内容Scanner A方式
*
* @param inputStream
* @return
*/
public static String read4ScannerA(InputStream inputStream) {
Scanner s = new Scanner(inputStream).useDelimiter("\\A");
String str = s.hasNext() ? s.next() : "";
return str;
}
/**
* 读取IO流内容Scanner Z方式
*
* @param inputStream
* @return
*/
public static String read4ScannerZ(InputStream inputStream) {
return new Scanner(inputStream).useDelimiter("\\Z").next();
}
/**
* 读取IO流内容StringBuilder方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
*/
public static String read4StringBuilder(InputStream inputStream, Charset charset) throws IOException {
StringBuilder sb = new StringBuilder();
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset));
while ((line = br.readLine()) != null) {
sb.append(line);
}
return sb.toString();
}
/**
* 读取IO流内容ByteArrayOutputStream方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
*/
public static String read4Buffer(InputStream inputStream, Charset charset) throws IOException {
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
return result.toString(charset == null ? Charset.defaultCharset().name() : charset.name());
}
/**
* 读取IO流内容BufferedInputStream+ByteArrayOutputStream方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
*/
public static String read4BufferIO(InputStream inputStream, Charset charset) throws IOException {
BufferedInputStream bis = new BufferedInputStream(inputStream);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
int result = bis.read();
while (result != -1) {
buf.write((byte) result);
result = bis.read();
}
return buf.toString(charset == null ? Charset.defaultCharset().name() : charset.name());
}
/**
* 读取IO流内容 依赖于commons-io:commons-io {@link IOUtils#copy(Reader, OutputStream, Charset)}
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4IOUtilsCopy(InputStream inputStream, Charset charset) throws IOException {
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, charset == null ? Charset.defaultCharset() : charset);
return writer.toString();
}
/**
* 读取IO流内容 依赖于commons-io:commons-io {@link IOUtils#toString(InputStream, Charset)}
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4IOUtils(InputStream inputStream, Charset charset) throws IOException {
return IOUtils.toString(inputStream, charset == null ? Charset.defaultCharset() : charset);
}
/**
* 读取IO流内容 依赖于com.google.guava:guava {@link com.google.common.io.CharStreams#toString(Readable)}
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4CharStreams(InputStream inputStream, Charset charset) throws IOException, ClassNotFoundException {
try {
Class<?> charStreamsClass = Class.forName("com.google.common.io.CharStreams");
Method toStringMethod = charStreamsClass.getMethod("toString", InputStreamReader.class);
return (String) toStringMethod.invoke(null, new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset));
} catch (ClassNotFoundException e) {
throw new ClassNotFoundException("缺少依赖请引入Guava");
} catch (ReflectiveOperationException e) {
throw new RuntimeException("com.google.common.io.CharStreams.toString调用失败请检查Guava版本", e);
}
// return com.google.common.io.CharStreams.toString(new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset));
}
/**
* 读取IO流内容 依赖于com.google.guava:guava {@link com.google.common.io.ByteStreams#toByteArray(InputStream)}
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4ByteStreams(InputStream inputStream, Charset charset) throws IOException, ClassNotFoundException {
try {
Class<?> charStreamsClass = Class.forName("com.google.common.io.ByteStreams");
Method toStringMethod = charStreamsClass.getMethod("toByteArray", InputStreamReader.class);
return (String) toStringMethod.invoke(null, new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset));
} catch (ClassNotFoundException e) {
throw new ClassNotFoundException("缺少依赖请引入Guava");
} catch (ReflectiveOperationException e) {
throw new RuntimeException("com.google.common.io.ByteStreams.toByteArray调用失败请检查Guava版本", e);
}
// return new String(com.google.common.io.ByteStreams.toByteArray(inputStream), charset == null ? Charset.defaultCharset() : charset);
}
}
/*public static void main(String[] args) {
long size = FileUtil.size(new File("E:\\OS\\deepin-15.6-amd64\\DeepinCloudPrintServerInstaller_1.0.0.1.exe"));
System.out.println(size);
System.out.println(1024 * 1024 * 5);
if (size > 1024 * 1024 * 5) {
System.out.println("文件最大5M");
return;
}
long s1 = fileSize(new File("E:\\OS\\cn_windows_10_consumer_editions_version_1803_updated_march_2018_x64_dvd_12063766.iso"));
System.out.println(s1);
long s2 = fileSize4Stream(new File("E:\\OS\\cn_windows_10_consumer_editions_version_1803_updated_march_2018_x64_dvd_12063766.iso"));
System.out.println(s2);
String s1 = base64(new File("C:\\Users\\Administrator\\Desktop\\a.html"));
System.out.println(s1);
String s = sha1(new File("C:\\Users\\Administrator\\Desktop\\a.html"));
String s2 = sha1ByBigFile(new File("C:\\Users\\Administrator\\Desktop\\a.html"));
System.out.println(s);
System.out.println(s2);
String md5 = md5(new File("C:\\Users\\Administrator\\Desktop\\a.html"));
String md52 = md5ByBigFile(new File("C:\\Users\\Administrator\\Desktop\\a.html"));
System.out.println(md5);
System.out.println(md52);
String crc32 = crc32(new File("C:\\Users\\Administrator\\Desktop\\a.html"));
System.out.println(crc32);
}*/

View File

@@ -50,7 +50,7 @@ public class CsvToBean {
return this;
}
public boolean isHasHeader() {
public boolean hasHeader() {
return hasHeader;
}

View File

@@ -1,7 +1,5 @@
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;
@@ -120,4 +118,8 @@ public class ReadFileBean<T> {
public String lineScavenge(String lineData) {
return this.lineScavenger.apply(lineData);
}
public boolean hasNext() {
return this.fileLength > this.pointer;
}
}

View File

@@ -448,6 +448,8 @@ public class DateTimeUtil {
System.out.println(format(getYear4First().atTime(LocalTime.MIN)));
System.out.println(format(getYear4Last().atTime(LocalTime.MAX)));
System.out.println(parseLocalDateTime10(System.currentTimeMillis() / 1000));
System.out.println(parseLocalDateTime13(System.currentTimeMillis()));
}*/

View File

@@ -59,8 +59,8 @@ public class DateUtil {
/**
* 比较两个日期大小
*
* @param date1
* @param date2
* @param date1 格式 yyyy-MM-dd
* @param date2 格式 yyyy-MM-dd
* @return date1>date2返回1;date1=date2返回0;date1<date2返回-1
* @throws ParseException
*/
@@ -80,57 +80,122 @@ public class DateUtil {
/**
* 日期字符串转date
*
* @param dateStr
* @return Date
* @param dateStr 格式yyyy-MM-dd
* @return Date 日期
* @throws ParseException
* @deprecated 替代参考 {@link #parseDate(String, String)}
* @see 1.5.2
*/
@Deprecated
public static Date str2date(String dateStr) throws ParseException {
Date date = DATE_FORMAT.parse(dateStr);
return date;
}
/**
* date转字符串
*
* @param date
* @return Date
* @throws ParseException
* @param date 日期
* @return String 格式 yyyy-MM-dd
* @deprecated 替代参考 {@link #formatDate(Date, String)} 或 {@link #formatDate(Date, String, Locale)}
* @see 1.5.2
*/
public static String date2str(Date date) throws ParseException {
@Deprecated
public static String date2str(Date date) {
if (date != null) {
return DATE_FORMAT.format(date);
} else {
return "null";
return "";
}
}
/**
* 日期字符串转dateTime
*
* @param dateStr
* @return
* @param dateStr 格式yyyy-MM-dd HH:mm:ss.SSS
* @return Date 时间
* @throws ParseException
* @deprecated 替代参考 {@link #parseDate(String, String)}
* @see 1.5.2
*/
@Deprecated
public static Date str2dateTime(String dateStr) throws ParseException {
Date date = DATE_TIME_FORMAT.parse(dateStr);
return date;
return DATE_TIME_FORMAT.parse(dateStr);
}
/**
* dateTime转字符串
*
* @param date
* @return Date
* @throws ParseException
* @param date 时间
* @return String 格式yyyy-MM-dd HH:mm:ss.SSS
* @deprecated 替代参考 {@link #formatDate(Date, String)} 或 {@link #formatDate(Date, String, Locale)}
* @see 1.5.2
*/
public static String dateTime2str(Date date) throws ParseException {
@Deprecated
public static String dateTime2str(Date date) {
if (date != null) {
return DATE_TIME_FORMAT.format(date);
} else {
return "null";
return "";
}
}
/**
* 格式化当前日期为指定格式的字符串。
*
* @param dateFormat 日期格式字符串,用于指定日期的输出格式,例如"yyyy-MM-dd HH:mm:ss"。
* @return 格式化后的当前日期字符串。
*/
public static String formatDateNow(String dateFormat) {
return formatDate(new Date(), dateFormat); // 使用系统当前时间生成日期对象,并按指定格式进行格式化。
}
/**
* 解析字符串形式的日期到Date对象。
*
* @param dateStr 待解析的日期字符串。
* @param dateFormat 日期字符串的格式。
* @return 返回解析后的Date对象如果解析失败则返回null。
* @throws ParseException
*/
public static Date parseDate(String dateStr, String dateFormat) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
// 尝试根据给定的日期格式解析日期字符串
return sdf.parse(dateStr);
}
/**
* 根据指定的日期格式和地域格式化日期对象为字符串。
* 如果未指定地域,则默认使用中文地域格式。
*
* @param date 需要格式化的日期对象。
* @param dateFormat 日期格式字符串,例如"yyyy-MM-dd"。
* @return 格式化后的日期字符串。
*/
public static String formatDate(Date date, String dateFormat) {
return formatDate(date, dateFormat, null);
}
/**
* 根据指定的日期格式、地域格式化日期对象为字符串。
*
* @param date 需要格式化的日期对象。
* @param dateFormat 日期格式字符串,例如"yyyy-MM-dd"。
* @param locale 地域设置如果为null则默认使用中文地域。
* @return 格式化后的日期字符串。
*/
public static String formatDate(Date date, String dateFormat, Locale locale) {
SimpleDateFormat sdf;
// 根据是否提供了地域参数来创建SimpleDateFormat实例
if (StrUtil.isEmpty(locale)) {
sdf = new SimpleDateFormat(dateFormat, Locale.CHINA);
} else {
sdf = new SimpleDateFormat(dateFormat, locale);
}
return sdf.format(date);
}
/**
* 获取本周的日期
@@ -232,4 +297,19 @@ public class DateUtil {
return Date.from(date.toInstant().atZone(currentZone).withZoneSameInstant(targetZone).toInstant());
}
/* public static void main(String[] args) throws ParseException {
System.out.println(DateUtil.currentDate());
System.out.println(DateUtil.currentTime());
System.out.println(DateUtil.currentDateTime());
System.out.println(DateUtil.dateCompare("2024-01-25","2025-01-01"));
System.out.println(DateUtil.str2date("2024-01-25"));
System.out.println(DateUtil.date2str(new Date()));
System.out.println(DateUtil.str2dateTime("2024-04-08 11:01:39.361"));
System.out.println(DateUtil.dateTime2str(new Date()));
System.out.println(DateUtil.getCurrentWeek(1));
System.out.println(DateUtil.dateMinus(DateUtil.datePlus(new Date(),50),new Date(),'M'));
System.out.println(DateUtil.convertUTC(new Date()));
System.out.println(DateUtil.convertTimezone(new Date(),"UTC","Asia/Shanghai"));
System.out.println(DateUtil.convertTimezone(new Date(),"UTC"));
}*/
}

View File

@@ -1,45 +1,35 @@
package com.yexuejc.base.util;
import com.fasterxml.jackson.databind.MappingIterator;
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.CsvToBean;
import com.yexuejc.base.pojo.ReadFileBean;
import io.jsonwebtoken.lang.Assert;
import org.apache.commons.io.IOUtils;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.io.StringWriter;
import java.math.BigInteger;
import java.nio.MappedByteBuffer;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;
import java.util.Scanner;
import java.util.function.Function;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.zip.CRC32;
import com.fasterxml.jackson.databind.MappingIterator;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
import com.yexuejc.base.annotation.CsvToBean;
import com.yexuejc.base.pojo.ReadFileBean;
import io.jsonwebtoken.lang.Assert;
/**
* 文件工具类
*
@@ -49,11 +39,14 @@ import java.util.zip.CRC32;
* @time 2017年11月3日 下午3:12:49
*/
public class FileUtil {
static Logger logger = Logger.getLogger(FileUtil.class.getName());
private static final Logger logger = Logger.getLogger(FileUtil.class.getName());
public FileUtil() {
private FileUtil() {
}
private static final String NEW_LINE = "\n";
private static final String CONSTANT_DOT = ".";
private static final String TYPE_TAR_GZ = ".tar.gz";
private static final String TYPE_CSV = ".csv";
private static final String TAR_GZ = "tar.gz";
@@ -72,32 +65,48 @@ public class FileUtil {
if (fileName.lastIndexOf(TYPE_TAR_GZ) > 0) {
return TAR_GZ;
}
return fileName.substring(fileName.lastIndexOf(".") + 1);
return fileName.substring(fileName.lastIndexOf(CONSTANT_DOT) + 1);
} catch (Exception e) {
logger.severe("file doesn't exist or is not a file");
}
return null;
}
/**
* 判断文件是否存在
*
* @param filePath
* @return false 文件不存在true 文件存在
*/
public static boolean isFileExist(String filePath) {
if (StrUtil.isEmpty(filePath)) {
return false;
}
File file = new File(filePath);
return file.exists() && !file.isDirectory();
}
/**
* 判断文件是否存在,不存在就创建一个空的
*
* @param file
*/
public static void judeFileExists(File file) {
if (file.exists()) {
logger.severe("file exists");
} else {
logger.info("file not exists, create it ...");
try {
file.createNewFile();
boolean b = file.createNewFile();
if (b) {
logger.info("file create success");
} else {
logger.severe("file create fail");
}
} catch (IOException e) {
logger.severe("file create fail");
e.printStackTrace();
logger.log(Level.WARNING, "file create fail", e);
}
}
}
/**
@@ -134,72 +143,9 @@ public class FileUtil {
* @return
*/
public static String sha1(File file) {
FileInputStream in = null;
try {
in = new FileInputStream(file);
MessageDigest digest = MessageDigest.getInstance("SHA-1");
byte[] buffer = new byte[1024 * 1024 * 10];
int len = 0;
while ((len = in.read(buffer)) > 0) {
digest.update(buffer, 0, len);
}
String sha1 = new BigInteger(1, digest.digest()).toString(16);
int length = 40 - sha1.length();
if (length > 0) {
for (int i = 0; i < length; i++) {
sha1 = "0" + sha1;
}
}
return sha1;
} catch (NoSuchAlgorithmException e) {
logger.severe("system algorithm error.");
e.printStackTrace();
} catch (FileNotFoundException e) {
logger.severe("file doesn't exist or is not a file");
e.printStackTrace();
} catch (IOException e) {
logger.severe("The operation file is an IO exception.");
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
logger.severe("close FileInputStream IO exception.");
}
}
return null;
return getDigest(file, "SHA-1");
}
/***
* 计算SHA1码
*
* @return String 适用于上G大的文件
* @throws NoSuchAlgorithmException
* */
public static String sha1ByBigFile(File file) {
MessageDigest messagedigest = null;
try {
messagedigest = MessageDigest.getInstance("SHA-1");
FileInputStream in = new FileInputStream(file);
FileChannel ch = in.getChannel();
MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
messagedigest.update(byteBuffer);
return StrUtil.toHex(messagedigest.digest());
} catch (NoSuchAlgorithmException e) {
logger.severe("system algorithm error.");
e.printStackTrace();
} catch (FileNotFoundException e) {
logger.severe("file doesn't exist or is not a file");
e.printStackTrace();
} catch (IOException e) {
logger.severe("The operation file is an IO exception.");
e.printStackTrace();
}
return null;
}
/**
* 文件md5
@@ -208,66 +154,40 @@ public class FileUtil {
* @return
*/
public static String md5(File file) {
FileInputStream in = null;
try {
in = new FileInputStream(file);
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[1024 * 1024 * 10];
int len = 0;
while ((len = in.read(buffer)) > 0) {
digest.update(buffer, 0, len);
}
String md5 = new BigInteger(1, digest.digest()).toString(16);
int length = 32 - md5.length();
if (length > 0) {
for (int i = 0; i < length; i++) {
md5 = "0" + md5;
}
}
return md5;
} catch (IOException e) {
logger.severe("The operation file is an IO exception.");
} catch (NoSuchAlgorithmException e) {
logger.severe("system algorithm error.");
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
logger.severe("close FileInputStream IO exception.");
}
}
return null;
return getDigest(file, "MD5");
}
/**
* 对一个文件获取md5
*
* @return md5串
* @throws NoSuchAlgorithmException
* 获取文件的散列
* @param file
* @param digestCode
* @return
*/
public static String md5ByBigFile(File file) {
MessageDigest messagedigest = null;
try {
messagedigest = MessageDigest.getInstance("MD5");
FileInputStream in = new FileInputStream(file);
FileChannel ch = in.getChannel();
MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0,
file.length());
messagedigest.update(byteBuffer);
return StrUtil.toHex(messagedigest.digest());
private static String getDigest(File file, String digestCode) {
try (FileInputStream in = new FileInputStream(file)) {
MessageDigest digest = MessageDigest.getInstance(digestCode);
FileChannel channel = in.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024); // 1MB 缓冲区
// 读取文件内容并更新 MessageDigest
while (channel.read(buffer) != -1) {
buffer.flip(); // 将 Buffer 从写模式切换到读模式
digest.update(buffer); // 更新 MessageDigest
buffer.clear(); // 清空 Buffer
}
// 计算最终的 SHA-1 散列值
byte[] sha1Bytes = digest.digest();
// 将字节数组转换为十六进制字符串
StringBuilder sha1Builder = new StringBuilder();
for (byte b : sha1Bytes) {
sha1Builder.append(String.format("%02x", b));
}
return sha1Builder.toString();
} catch (NoSuchAlgorithmException e) {
logger.severe("system algorithm error.");
e.printStackTrace();
logger.log(Level.SEVERE, "system algorithm error.", e);
} catch (FileNotFoundException e) {
logger.severe("file doesn't exist or is not a file");
e.printStackTrace();
logger.log(Level.SEVERE, "file doesn't exist or is not a file", e);
} catch (IOException e) {
logger.severe("The operation file is an IO exception.");
e.printStackTrace();
logger.log(Level.SEVERE, "The operation file is an IO exception.", e);
}
return null;
}
@@ -275,37 +195,24 @@ public class FileUtil {
/**
* 获取文件CRC32码
*
* @return String
* @return 获取失败返回-1
*/
public static String crc32(File file) {
public static long crc32(File file) {
CRC32 crc32 = new CRC32();
// MessageDigest.get
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
byte[] buffer = new byte[8192];
try (FileInputStream fileInputStream = new FileInputStream(file);) {
byte[] buffer = new byte[1024 * 1024];
int length;
while ((length = fileInputStream.read(buffer)) != -1) {
crc32.update(buffer, 0, length);
}
return crc32.getValue() + "";
return crc32.getValue();
} catch (FileNotFoundException e) {
logger.severe("file doesn't exist or is not a file");
e.printStackTrace();
return null;
logger.log(Level.SEVERE, "file doesn't exist or is not a file", e);
return -1;
} catch (IOException e) {
logger.severe("The operation file is an IO exception.");
e.printStackTrace();
return null;
} finally {
try {
if (fileInputStream != null) {
fileInputStream.close();
}
} catch (IOException e) {
logger.severe("close FileInputStream IO exception.");
e.printStackTrace();
}
logger.log(Level.SEVERE, "The operation file is an IO exception.", e);
return -1;
}
}
@@ -317,7 +224,7 @@ public class FileUtil {
*/
public static String base64ToStr(File file) {
try {
byte[] bytes = Files.readAllBytes(Path.of(file.getPath()));
byte[] bytes = Files.readAllBytes(Paths.get(file.getPath()));
return Base64.getEncoder().encodeToString(bytes);
} catch (IOException e) {
logger.severe("The operation file is an IO exception.");
@@ -333,10 +240,10 @@ public class FileUtil {
* </i>
*
* @param decode {@link FileUtil#base64ToStr(File)} 的结果
* @param fileName 保存文件名称(包含路径)
* @param fileName 文件名称(包含路径)
* @return 返回保存地址
*/
public static String base64ToFile(String decode, String fileName) {
public static String base64ToFile(String decode, String fileName) throws IOException {
return base64ToFile(Base64.getDecoder().decode(decode.getBytes()), fileName);
}
@@ -344,29 +251,16 @@ public class FileUtil {
* base64转文件
* <p>
* <i>
* 文件转base64请使用 {@link FileUtil#base64ToStr(File)}
* 文件转base64请使用 {@link FileUtil#base64ToStr(File)}}
* </i>
*
* @param decode baseByte
* @param fileName 文件名称(包含路径)
* @return 返回保存地址
*/
public static String base64ToFile(byte[] decode, String fileName) {
FileOutputStream out = null;
try {
out = new FileOutputStream(fileName);
public static String base64ToFile(byte[] decode, String fileName) throws IOException {
try (FileOutputStream out = new FileOutputStream(fileName)) {
out.write(decode);
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return fileName;
}
@@ -374,50 +268,18 @@ public class FileUtil {
/**
* 获取文件大小 :直接返回大小
*
* @param f
* @param path 文件地址
* @return f.length()
*/
public static long size(File f) {
if (f.exists() && f.isFile()) {
return f.length();
public static long size(Path path) throws IOException {
if (Files.exists(path) && Files.isRegularFile(path)) {
return Files.size(path);
} else {
logger.info("file doesn't exist or is not a file");
}
return 0;
}
/**
* 获取文件大小 : 用流的方式获取
*
* @param f
* @return
*/
public static long size4Stream(File f) {
FileChannel fc = null;
try {
if (f.exists() && f.isFile()) {
FileInputStream fis = new FileInputStream(f);
fc = fis.getChannel();
return fc.size();
} else {
logger.info("file doesn't exist or is not a file");
}
} catch (FileNotFoundException e) {
logger.severe("file doesn't exist or is not a file");
} catch (IOException e) {
logger.severe("The operation file is an IO exception.");
} finally {
if (null != fc) {
try {
fc.close();
} catch (IOException e) {
logger.severe("close FileInputStream IO exception.");
}
}
}
return 0;
}
/**
* 字符串csv格式转 对象
*
@@ -444,14 +306,15 @@ public class FileUtil {
*
* @param csvFilePath 文件地址
* @param cls 读取转化的对象
* @param hasHeader 是否存在header
* @param header 解析列对应的java字段用delimiter分割
* @param hasHeader csv文件中第一行是否是header
* @param delimiter 分隔符.默认【,】
* @param <I>
* @return
*/
public static <I> List<I> readCsv(final String csvFilePath, Class<I> cls, boolean hasHeader, char delimiter) {
public static <I> List<I> readCsv(final String csvFilePath, Class<I> cls, boolean hasHeader, String header, char delimiter) {
if (!isFileExist(csvFilePath)) {
throw new RuntimeException(String.format("解析用的csv\u0020[%s] 文件不存在。", csvFilePath));
throw new RuntimeException(String.format("解析用的csv [%s] 文件不存在。", csvFilePath));
}
if (StrUtil.isEmpty(delimiter)) {
delimiter = ',';
@@ -459,7 +322,12 @@ public class FileUtil {
try {
File csvFile = new File(csvFilePath);
CsvMapper csvMapper = new CsvMapper();
CsvSchema csvSchema = csvMapper.typedSchemaFor(cls).withStrictHeaders(hasHeader).withColumnSeparator(delimiter).withComments();
CsvSchema.Builder builder = CsvSchema.builder();
if (StrUtil.isNotEmpty(header)) {
builder.addColumns(Arrays.asList(header.split(String.valueOf(delimiter))), CsvSchema.ColumnType.STRING);
}
CsvSchema csvSchema = builder.build().withColumnSeparator(delimiter).withSkipFirstDataRow(hasHeader).withStrictHeaders(hasHeader).withComments();
MappingIterator<I> recordIterator = csvMapper.readerWithTypedSchemaFor(cls).with(csvSchema).readValues(csvFile);
return recordIterator.readAll();
} catch (IOException e) {
@@ -468,80 +336,90 @@ public class FileUtil {
}
/**
* 判断文件是否存在
* 分段读取大文件(不限格式)
*
* @param filePath
* @return
*/
public static boolean isFileExist(String filePath) {
if (StrUtil.isEmpty(filePath)) {
return false;
}
File file = new File(filePath);
return file.exists() && !file.isDirectory();
}
/**
* 分段读取大文件
*
* @param path 文件路径
* @param filePath 文件路径
* @param readFileBean 分段每次读取的bean 初始值需要设置每次读取的行数
* @param <T> 读取结果类型bean
* @return
* @return 文件分页读取内容(自定义处理后)及读取信息
*/
public <T> ReadFileBean<T> readBigFile(String path, ReadFileBean<T> readFileBean, Class<T> readCls) throws FileNotFoundException {
File file = new File(path);
if (!file.exists() || file.isDirectory()) {
throw new FileNotFoundException("file:" + path + " is not found.");
public static <T> ReadFileBean<T> readBigFile(String filePath, ReadFileBean<T> readFileBean, Function<List<String>, List<T>> readAfter) throws IOException {
if (!isFileExist(filePath)) {
throw new FileNotFoundException(String.format("[%s]文件不存在。", filePath));
}
try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r")) {
List<String> datas = new ArrayList<>();
try (RandomAccessFile randomAccessFile = new RandomAccessFile(new File(filePath), "r")) {
if (readFileBean.getPointer() < 0) {
readFileBean.setPointer(0);
}
randomAccessFile.seek(readFileBean.getPointer());
readFileBean.setFileLength(randomAccessFile.length());
List<String> datas = new ArrayList<>();
int row = 1;
int row = 0;
String line;
while ((line = randomAccessFile.readLine()) != null && row < readFileBean.getReadRowNum()) {
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());
datas.add(readFileBean.lineScavenge(charsetDecode(line, readFileBean.getReadCharset())));
}
if (path.contains(TYPE_CSV)) {
//csv文件处理
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<T> dataList = readCsv(String.join("\n", datas), readCls, csvToBean.getDelimiter());
readFileBean.setDatas(dataList);
}
} catch (FileNotFoundException e) {
logger.severe("file exists." + e.getMessage());
} catch (IOException e) {
logger.severe("read file error." + e.getMessage());
}
if (StrUtil.isEmpty(datas)) {
//无数据
return readFileBean.setDatas(new ArrayList<>());
}
List<T> dataList = readAfter.apply(datas);
readFileBean.setDatas(dataList);
return readFileBean;
}
/**
* 分段读取大文件(不解析)
*
* @param csvFilePath 文件路径
* @param readFileBean 分段每次读取的bean 初始值需要设置每次读取的行数
* @return 文件分页读取内容每行为一个String对象及读取信息
*/
public static ReadFileBean<String> readBigFile(String csvFilePath, ReadFileBean<String> readFileBean) throws IOException {
return readBigFile(csvFilePath, readFileBean, (datas) -> datas);
}
/**
* 分段读取大文件(CSV格式)
*
* @param csvFilePath 文件路径
* @param readFileBean 分段每次读取的bean 初始值需要设置每次读取的行数
* @param <T> 读取结果类型bean
* @return 文件分页读取内容转bean后及读取信息
*/
public static <T> ReadFileBean<T> readBigFile(String csvFilePath, ReadFileBean<T> readFileBean, Class<T> readCls) throws IOException {
if (!csvFilePath.endsWith(TYPE_CSV)) {
throw new IOException(String.format("[%s]文件不是CSV文件格式。", csvFilePath));
}
return readBigFile(csvFilePath, readFileBean, (datas) -> {
//csv文件处理
com.yexuejc.base.pojo.CsvToBean csvToBean = getCsvToBean(readCls);
readFileBean.setHeader(csvToBean.getHeader());
if (csvToBean.hasHeader()) {
//文件存在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());
}
try {
return readCsv(String.join(NEW_LINE, datas), readCls, csvToBean.getDelimiter());
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}
/**
* 获取csv的header,使用注解{@link CsvToBean}
*
@@ -551,10 +429,8 @@ public class FileUtil {
*/
public static <T> com.yexuejc.base.pojo.CsvToBean getCsvToBean(Class<T> 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;
Assert.notNull(annotation, cls + "类上需要添加注解@CsvToBean并指定header。");
return new com.yexuejc.base.pojo.CsvToBean(annotation.header(), annotation.delimiter(), annotation.hasHeader());
}
/**
@@ -572,223 +448,4 @@ public class FileUtil {
}
return new String(result, charset);
}
/**
* 提供读取IO流方法合集
* <p>读取速度快慢顺序:</p>
* 1. {@link #read4Buffer(InputStream, Charset)} <br>
* 2. {@link #read4IOUtilsCopy(InputStream, Charset)} <br>
* 3. {@link #read4ByteStreams(InputStream, Charset)} <br>
* 4. {@link #read4Byte(InputStream, Charset)} <br>
* 5. {@link #read4StringBuilder(InputStream, Charset)} <br>
* 6. {@link #read4BufferedReaderParallel(InputStream, Charset, String)}<br>
* 7. {@link #read4BufferedReader(InputStream, Charset, String)}<br>
* 8. {@link #read4ScannerA(InputStream)}<br>
* 9. {@link #read4BufferIO(InputStream, Charset)}<br>
* 10. {@link #read4IOUtils(InputStream, Charset)}<br>
* 11. {@link #read4ScannerZ(InputStream)}<br>
* 12. {@link #read4CharStreams(InputStream, Charset)}<br>
*/
public static class FileInput {
/**
* 读取IO流内容byte方式
*
* @param inputStream
* @param charset 编码:默认 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4Byte(InputStream inputStream, Charset charset) throws IOException {
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
return new String(bytes, charset == null ? Charset.defaultCharset() : charset);
}
/**
* 读取IO流内容BufferedReader方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @param lineSeparator 换行方式:默认跟随系统 {@link System#lineSeparator()}
* @return
*/
public static String read4BufferedReader(InputStream inputStream, Charset charset, String lineSeparator) {
return new BufferedReader(
new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset)
).lines().collect(Collectors.joining(lineSeparator == null ? System.lineSeparator() : lineSeparator));
}
/**
* 读取IO流内容BufferedReader 并行方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @param lineSeparator 换行方式:默认跟随系统 {@link System#lineSeparator()}
* @return
*/
public static String read4BufferedReaderParallel(InputStream inputStream, Charset charset, String lineSeparator) {
return new BufferedReader(
new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset)
).lines().parallel()
.collect(Collectors.joining(lineSeparator == null ? System.lineSeparator() : lineSeparator));
}
/**
* 读取IO流内容Scanner A方式
*
* @param inputStream
* @return
*/
public static String read4ScannerA(InputStream inputStream) {
Scanner s = new Scanner(inputStream).useDelimiter("\\A");
String str = s.hasNext() ? s.next() : "";
return str;
}
/**
* 读取IO流内容Scanner Z方式
*
* @param inputStream
* @return
*/
public static String read4ScannerZ(InputStream inputStream) {
return new Scanner(inputStream).useDelimiter("\\Z").next();
}
/**
* 读取IO流内容StringBuilder方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
*/
public static String read4StringBuilder(InputStream inputStream, Charset charset) throws IOException {
StringBuilder sb = new StringBuilder();
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset));
while ((line = br.readLine()) != null) {
sb.append(line);
}
return sb.toString();
}
/**
* 读取IO流内容ByteArrayOutputStream方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
*/
public static String read4Buffer(InputStream inputStream, Charset charset) throws IOException {
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
return result.toString(charset == null ? Charset.defaultCharset().name() : charset.name());
}
/**
* 读取IO流内容BufferedInputStream+ByteArrayOutputStream方式
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
*/
public static String read4BufferIO(InputStream inputStream, Charset charset) throws IOException {
BufferedInputStream bis = new BufferedInputStream(inputStream);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
int result = bis.read();
while (result != -1) {
buf.write((byte) result);
result = bis.read();
}
return buf.toString(charset == null ? Charset.defaultCharset().name() : charset.name());
}
/**
* 读取IO流内容 依赖于commons-io:commons-io {@link IOUtils#copy(Reader, OutputStream, Charset)}
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4IOUtilsCopy(InputStream inputStream, Charset charset) throws IOException {
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, charset == null ? Charset.defaultCharset() : charset);
return writer.toString();
}
/**
* 读取IO流内容 依赖于commons-io:commons-io {@link IOUtils#toString(InputStream, Charset)}
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4IOUtils(InputStream inputStream, Charset charset) throws IOException {
return IOUtils.toString(inputStream, charset == null ? Charset.defaultCharset() : charset);
}
/**
* 读取IO流内容 依赖于com.google.guava:guava {@link CharStreams#toString(Readable)}
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4CharStreams(InputStream inputStream, Charset charset) throws IOException {
return CharStreams.toString(new InputStreamReader(inputStream, charset == null ? Charset.defaultCharset() : charset));
}
/**
* 读取IO流内容 依赖于com.google.guava:guava {@link ByteStreams#toByteArray(InputStream)}
*
* @param inputStream
* @param charset 编码:默认跟随系统 {@link Charset#defaultCharset()}
* @return
* @throws IOException
*/
public static String read4ByteStreams(InputStream inputStream, Charset charset) throws IOException {
return new String(ByteStreams.toByteArray(inputStream), charset == null ? Charset.defaultCharset() : charset);
}
}
/*public static void main(String[] args) {
long size = FileUtil.size(new File("E:\\OS\\deepin-15.6-amd64\\DeepinCloudPrintServerInstaller_1.0.0.1.exe"));
System.out.println(size);
System.out.println(1024 * 1024 * 5);
if (size > 1024 * 1024 * 5) {
System.out.println("文件最大5M");
return;
}
long s1 = fileSize(new File("E:\\OS\\cn_windows_10_consumer_editions_version_1803_updated_march_2018_x64_dvd_12063766.iso"));
System.out.println(s1);
long s2 = fileSize4Stream(new File("E:\\OS\\cn_windows_10_consumer_editions_version_1803_updated_march_2018_x64_dvd_12063766.iso"));
System.out.println(s2);
String s1 = base64(new File("C:\\Users\\Administrator\\Desktop\\a.html"));
System.out.println(s1);
String s = sha1(new File("C:\\Users\\Administrator\\Desktop\\a.html"));
String s2 = sha1ByBigFile(new File("C:\\Users\\Administrator\\Desktop\\a.html"));
System.out.println(s);
System.out.println(s2);
String md5 = md5(new File("C:\\Users\\Administrator\\Desktop\\a.html"));
String md52 = md5ByBigFile(new File("C:\\Users\\Administrator\\Desktop\\a.html"));
System.out.println(md5);
System.out.println(md52);
String crc32 = crc32(new File("C:\\Users\\Administrator\\Desktop\\a.html"));
System.out.println(crc32);
}*/
}

View File

@@ -1,17 +1,5 @@
package com.yexuejc.base.util;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.type.MapType;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.yexuejc.base.converter.*;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Timestamp;
@@ -21,6 +9,30 @@ import java.util.Map;
import java.util.TimeZone;
import java.util.logging.Logger;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.type.MapType;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.yexuejc.base.converter.LocalDateDeserializer;
import com.yexuejc.base.converter.LocalDateSerializer;
import com.yexuejc.base.converter.LocalDateTimeDeserializer;
import com.yexuejc.base.converter.LocalDateTimeSerializer;
import com.yexuejc.base.converter.TimestampDeserializer;
import com.yexuejc.base.converter.TimestampSerializer;
/**
* json工具类基于jackson
*
@@ -30,7 +42,7 @@ import java.util.logging.Logger;
* @date 2018/9/3 15:28
*/
public class JsonUtil {
private static Logger log = Logger.getLogger(JsonUtil.class.getName());
private static final Logger log = Logger.getLogger(JsonUtil.class.getName());
private JsonUtil() {
}
@@ -38,10 +50,9 @@ public class JsonUtil {
/**
* 作为单例全局使用
*/
private static JsonMapper jsonMapper = new JsonMapper();
private static final JsonMapper jsonMapper = new JsonMapper();
static {
JsonUtil.setJavaTimeModule(JsonUtil.jsonMapper);
JsonUtil.initDefaultObjectMapper(JsonUtil.jsonMapper);
}
@@ -82,14 +93,17 @@ public class JsonUtil {
* </pre>
*
* @param jsonMapper
* @return
*/
private static void initDefaultObjectMapper(ObjectMapper jsonMapper) {
private static ObjectMapper initDefaultObjectMapper(ObjectMapper jsonMapper) {
JsonUtil.setJavaTimeModule(jsonMapper);
//值为空时NON_NULL舍去字段ALWAYS:保留字段
jsonMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
jsonMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
jsonMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
jsonMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jsonMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
return jsonMapper;
}
/**
@@ -109,8 +123,7 @@ public class JsonUtil {
*
* @return
*/
public static ObjectMapper acceptEmptyStringAsNullObject() {
JsonMapper jsonMapper = new JsonMapper();
public static ObjectMapper acceptEmptyStringAsNullObject(JsonMapper jsonMapper) {
setJavaTimeModule(jsonMapper);
//值为空时ALWAYS:保留字段默认字符串值为“”对象值为null
jsonMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
@@ -179,11 +192,11 @@ public class JsonUtil {
try {
pojo = jsonMapper.readValue(json, cls);
} catch (JsonParseException e) {
log.warning("json to Object JsonParseException.\n" + e.getMessage());
log.warning("json to Object JsonParseException.\n" + e);
} catch (JsonMappingException e) {
log.warning("json to Object JsonMappingException.\n" + e.getMessage());
log.warning("json to Object JsonMappingException.\n" + StrUtil.printStackTrace(e));
} catch (IOException e) {
log.warning("json to Object IOException.\n" + e.getMessage());
log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e));
}
return pojo;
@@ -201,13 +214,13 @@ public class JsonUtil {
try {
pojo = jsonMapper.readValue(json, cls);
} catch (JsonParseException e) {
log.warning("json to Object JsonParseException.\n" + e.getMessage());
log.warning("json to Object JsonParseException.\n" + StrUtil.printStackTrace(e));
} catch (JsonMappingException e) {
log.warning("json to Object JsonMappingException.\n" + e.getMessage());
log.warning("json to Object JsonMappingException.\n" + StrUtil.printStackTrace(e));
} catch (IOException e) {
log.warning("json to Object IOException.\n" + e.getMessage());
log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e));
} catch (Exception e) {
e.printStackTrace();
log.warning("json to Object Exception.\n" + StrUtil.printStackTrace(e));
}
return pojo;
@@ -227,11 +240,34 @@ public class JsonUtil {
try {
pojo = jsonMapper.readValue(json, javaType);
} catch (JsonParseException e) {
log.warning("json to Object JsonParseException.\n" + e.getMessage());
log.warning("json to Object JsonParseException.\n" + StrUtil.printStackTrace(e));
} catch (JsonMappingException e) {
log.warning("json to Object JsonMappingException.\n" + e.getMessage());
log.warning("json to Object JsonMappingException.\n" + StrUtil.printStackTrace(e));
} catch (IOException e) {
log.warning("json to Object IOException.\n" + e.getMessage());
log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e));
}
return pojo;
}
/**
* Json字符串转换为Java对象
*
* @param in 输入流
* @param parametrized 容器类
* @param parameterClasses 实际类
* @return
*/
public static <T> T json2Obj(InputStream in, Class<T> parametrized, Class<?>... parameterClasses) {
T pojo = null;
JavaType javaType = jsonMapper.getTypeFactory().constructParametricType(parametrized, parameterClasses);
try {
pojo = jsonMapper.readValue(in, javaType);
} catch (JsonParseException e) {
log.warning("json to Object JsonParseException.\n" + StrUtil.printStackTrace(e));
} catch (JsonMappingException e) {
log.warning("json to Object JsonMappingException.\n" + StrUtil.printStackTrace(e));
} catch (IOException e) {
log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e));
}
return pojo;
}
@@ -252,11 +288,11 @@ public class JsonUtil {
try {
pojo = jsonMapper.readValue(json, mapType);
} catch (JsonParseException e) {
log.warning("json to Object JsonParseException.\n" + e.getMessage());
log.warning("json to Object JsonParseException.\n" + StrUtil.printStackTrace(e));
} catch (JsonMappingException e) {
log.warning("json to Object JsonMappingException.\n" + e.getMessage());
log.warning("json to Object JsonMappingException.\n" + StrUtil.printStackTrace(e));
} catch (IOException e) {
log.warning("json to Object IOException.\n" + e.getMessage());
log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e));
}
return pojo;
}
@@ -273,34 +309,11 @@ public class JsonUtil {
try {
return jsonMapper.readValue(json, javaType);
} catch (JsonProcessingException e) {
log.warning("json to Object JsonParseException.\n" + e.getMessage());
log.warning("json to Object JsonParseException.\n" + StrUtil.printStackTrace(e));
}
return null;
}
/**
* Json字符串转换为Java对象
*
* @param json 字符串
* @param parametrized 容器类
* @param parameterClasses 实际类
* @return
*/
public static <T> T json2Obj(InputStream json, Class<T> parametrized, Class<?>... parameterClasses) {
T pojo = null;
JavaType javaType = jsonMapper.getTypeFactory().constructParametrizedType(parametrized, parametrized,
parameterClasses);
try {
pojo = jsonMapper.readValue(json, javaType);
} catch (JsonParseException e) {
log.warning("json to Object JsonParseException.\n" + e.getMessage());
} catch (JsonMappingException e) {
log.warning("json to Object JsonMappingException.\n" + e.getMessage());
} catch (IOException e) {
log.warning("json to Object IOException.\n" + e.getMessage());
}
return pojo;
}
/**
* 将任何对象转换为json
@@ -309,15 +322,31 @@ public class JsonUtil {
* @return 返回json
*/
public static String obj2Json(Object pojo) {
String json = null;
if (StrUtil.isEmpty(pojo)) {
return "";
}
String json = "";
try {
json = jsonMapper.writeValueAsString(pojo);
return jsonMapper.writeValueAsString(pojo);
} catch (JsonProcessingException e) {
log.warning("json to Object JsonProcessingException.\n" + e.getMessage());
log.warning("json to Object JsonProcessingException.\n" + StrUtil.printStackTrace(e));
}
return json;
}
/**
* 从bean到Map的转换
* <p>
* 例Map map = JsonUtil.obj2Map(data);
* </p>
*
* @param pojo bean
* @return Map
*/
public static Map<?, ?> objToMap(Object pojo) {
return json2Obj(obj2Json(pojo), Map.class);
}
/**
* 格式化输出
*
@@ -325,12 +354,13 @@ public class JsonUtil {
* @return 格式化后的字符串
*/
public static String formatPrinter(Object obj) {
String json = null;
String json = "";
try {
json = jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
} catch (JsonProcessingException e) {
log.warning("json to Object JsonProcessingException.\n" + e.getMessage());
log.warning("json to Object JsonProcessingException.\n" + StrUtil.printStackTrace(e));
}
return json;
}
}

View File

@@ -1,10 +1,12 @@
package com.yexuejc.base.util;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
import javax.crypto.SecretKey;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
/**
* jwt工具类
@@ -34,7 +36,7 @@ public class JwtUtil {
*
* @param key 加密key 默认h%OG8Y3WgA5AN7&6Ke7I#C1XvneW0N8a
* @param type 加密类型默认JWT
* @param iss token发行商: 默认yexuejc.com
* @param iss token发行商: 默认yexuejc.top
* @return
*/
public static JwtUtil config(String key, String type, String iss) {
@@ -60,7 +62,7 @@ public class JwtUtil {
/**
* token发行商
*/
private String JWT_CLAIMS_ISS = "yexuejc.com";
private String JWT_CLAIMS_ISS = "yexuejc.top";
/**
* 加密内容生成token
@@ -76,22 +78,22 @@ public class JwtUtil {
subject = JsonUtil.obj2Json(subjectObj);
}
Date now = new Date();
String token = Jwts.builder()
return Jwts.builder()
// 设置token的唯一标识IDclaims.jti
.setId(StrUtil.genUUID())
.id(StrUtil.genUUID())
// 设置token类型header.typ
.setHeaderParam("typ", JWT_HEADER_TYP)
.header().add("typ", JWT_HEADER_TYP)
.and()
// 设置token发行时间为当前时间claims.iat
.setIssuedAt(now)
.issuedAt(now)
// 设置token发行商/发行者claims.iss
.setIssuer(JWT_CLAIMS_ISS)
.issuer(JWT_CLAIMS_ISS)
// 设置token用户定义主体claims.sub
.setSubject(subject)
// 设置签名算法和KEYsignature
.signWith(SignatureAlgorithm.HS512, JWT_SIGNATURE_KEY)
.subject(subject)
// 设置算法签名,(密钥,加密算法)
.signWith(getSecretKey(), Jwts.SIG.HS512)
// 生成token
.compact();
return token;
}
/**
@@ -112,18 +114,8 @@ public class JwtUtil {
* @return
*/
public <T> T parse(String token, Class<T> cls) {
String subject = null;
try {
subject = Jwts.parser().setSigningKey(JWT_SIGNATURE_KEY).parseClaimsJws(token).getBody().getSubject();
} catch (Exception e) {
e.printStackTrace();
}
if (subject == null) {
return null;
}
return JsonUtil.json2Obj(subject, cls);
return JsonUtil.json2Obj(parseStr(token), cls);
}
/**
* 解密token为字符串
*
@@ -131,12 +123,11 @@ public class JwtUtil {
* @return
*/
public String parseStr(String token) {
String subject = null;
try {
subject = Jwts.parser().setSigningKey(JWT_SIGNATURE_KEY).parseClaimsJws(token).getBody().getSubject();
} catch (Exception e) {
e.printStackTrace();
}
return subject;
return Jwts.parser().verifyWith(getSecretKey()).build().parseSignedClaims(token).getPayload().getSubject();
}
private SecretKey getSecretKey() {
byte[] bytes = Decoders.BASE64.decode(JWT_SIGNATURE_KEY);
return Keys.hmacShaKeyFor(bytes);
}
}

View File

@@ -4,9 +4,13 @@ import com.yexuejc.base.annotation.ToUeProperty;
import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
/**
* 对象工具:对类的操作
@@ -18,6 +22,8 @@ import java.util.*;
* @date 2018/12/28 15:54
*/
public class ObjUtil {
private static Logger log = Logger.getLogger(ObjUtil.class.getName());
private ObjUtil() {
}
@@ -260,4 +266,150 @@ public class ObjUtil {
return outer;
}
/**
* 复制对象属性值,包含父类 (不需要getter和setter)
* <p>includeField和excludeField同时传入走包含逻辑</p>
*
* @param source 源对象
* @param targetClass 目标对象class
* @param includeField 包含对象
* @param excludeField 排除对象
* @param <I>
* @param <O>
* @return 目标对象
* @throws Exception
*/
public static <I, O> O copy(I source, Class<O> targetClass, List<String> includeField, List<String> excludeField) throws Exception {
List<Field> allFields = getAllFields(source.getClass());
O o = targetClass.getDeclaredConstructor().newInstance();
if (StrUtil.isNotEmpty(excludeField) && StrUtil.isEmpty(includeField)) {
allFields = allFields.stream().filter(f -> !excludeField.contains(f.getName())).collect(Collectors.toList());
}
if (StrUtil.isNotEmpty(includeField)) {
allFields = allFields.stream().filter(f -> includeField.contains(f.getName())).collect(Collectors.toList());
}
allFields.forEach(f -> {
try {
try {
Field field = targetClass.getDeclaredField(f.getName());
if (field != null) {
f.setAccessible(true);
Object v = f.get(source);
f.setAccessible(false);
field.setAccessible(true);
field.set(o, v);
field.setAccessible(false);
}
} catch (NoSuchFieldException e) {
}
} catch (Exception e) {
log.warning(lowerCaseFirstChar(f.getName()) + " field copy failed. " + e);
log.log(Level.FINER, lowerCaseFirstChar(f.getName()) +
" field copy failed. The exception information is as follows:", e);
}
});
return o;
}
/**
* 深度复制对象
* <p>获取source的所有getXxx。xxx作为属性且包含父类的getXxx</p>
* <p>查找target的xxx属性进行反射设值</p>
*
* @param source 源对象
* @param targetClass 目标对象class
* @param invokeSetter 设置target属性值时是否使用setter方法设置
* @param <I>
* @param <O>
* @return 目标对象
*/
public static <I, O> O copy(I source, Class<O> targetClass, boolean invokeSetter) throws Exception {
List<Method> getterMethods = getAllGetterMethods(source.getClass(), "get");
O o = targetClass.getDeclaredConstructor().newInstance();
getterMethods.forEach(method -> {
String fieldName = method.getName().replace("get", "");
try {
Object v = method.invoke(source);
if (invokeSetter) {
try {
Method setterMethod = targetClass.getDeclaredMethod("set" + fieldName, method.getReturnType());
if (null != setterMethod) {
setterMethod.invoke(o, v);
}
} catch (NoSuchMethodException e) {
}
} else {
try {
Field field = targetClass.getDeclaredField(lowerCaseFirstChar(fieldName));
if (field != null) {
field.setAccessible(true);
field.set(o, v);
field.setAccessible(false);
}
} catch (NoSuchFieldException e) {
}
}
} catch (Exception e) {
log.warning(lowerCaseFirstChar(fieldName) + " field copy failed. " + e);
log.log(Level.FINER, lowerCaseFirstChar(fieldName) +
" field copy failed. The exception information is as follows:\n", e);
}
});
return o;
}
/**
* 获取所有方法,包含父类
*
* @param beanClass
* @param startsWith 方法的开头匹配(空,返回所有)
* @return
*/
public static List<Method> getAllGetterMethods(Class<?> beanClass, String startsWith) {
List<Method> methodList = new ArrayList<>();
Method[] methods = beanClass.getDeclaredMethods();
if (StrUtil.isNotEmpty(startsWith)) {
methodList.addAll(Arrays.stream(methods)
.filter(method -> method.getName().startsWith(startsWith))
.collect(Collectors.toList()));
} else {
methodList.addAll(Arrays.asList(methods));
}
Class<?> superclass = beanClass.getSuperclass();
if (superclass != null) {
methodList.addAll(getAllGetterMethods(superclass, startsWith));
}
return methodList;
}
/**
* 获取所有属性,包含父类
*
* @param beanClass
* @return
*/
public static List<Field> getAllFields(Class<?> beanClass) {
List<Field> fieldList = new ArrayList<>();
while (beanClass != null) {
fieldList.addAll(Arrays.asList(beanClass.getDeclaredFields()));
beanClass = beanClass.getSuperclass();
}
return fieldList;
}
/**
* 首字母小写
*
* @param str
* @return
*/
public static String lowerCaseFirstChar(String str) {
if (str == null || str.length() == 0) {
return str;
} else {
return str.substring(0, 1).toLowerCase() + str.substring(1);
}
}
}

View File

@@ -1,9 +1,19 @@
package com.yexuejc.base.util;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Array;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Random;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -19,39 +29,28 @@ public final class StrUtil {
private StrUtil() {
}
public static char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
/**
* 判断字符串,数组,集合 是否为空
* 判断字符串,数组,集合 是否为空(null""[],{})
*
* @param obj
* @param obj 対象
* @return true:空;false:非空
* @return
*/
public static boolean isEmpty(Object obj) {
if (obj instanceof String) {
if (obj == null || "".equals((String) obj)) {
return true;
} else {
return false;
}
} else if (obj instanceof Object[]) {
if (obj == null || ((Object[]) obj).length == 0) {
return true;
} else {
return false;
}
} else if (obj instanceof Collection<?>) {
if (obj == null || ((Collection<?>) obj).size() == 0) {
return true;
} else {
return false;
}
if (obj == null) {
return true;
} else if (obj instanceof Optional) {
return ((Optional<?>) obj).isEmpty();
} else if (obj instanceof CharSequence) {
return ((CharSequence) obj).length() == 0;
} else if (obj.getClass().isArray()) {
return Array.getLength(obj) == 0;
} else if (obj instanceof Collection) {
return ((Collection<?>) obj).isEmpty();
} else {
if (obj == null) {
return true;
} else {
return false;
}
return obj instanceof Map && ((Map<?, ?>) obj).isEmpty();
}
}
@@ -80,12 +79,12 @@ public final class StrUtil {
} else if (length < 1) {
return "";
} else {
StringBuffer sb = new StringBuffer();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length / 32; i++) {
sb.append(genUUID());
}
if (length % 32 > 0) {
sb.append(genUUID().substring(0, length % 32));
sb.append(genUUID(), 0, length % 32);
}
return sb.toString();
}
@@ -101,48 +100,14 @@ public final class StrUtil {
*/
public static String genNum() {
int hashCode = UUID.randomUUID().toString().hashCode();
StringBuffer num = new StringBuffer();
StringBuilder num = new StringBuilder();
if (hashCode < 0) {
hashCode = 0 - hashCode;
hashCode = -hashCode;
num.append("0");
} else {
num.append("1");
}
return num.append(String.format("%010d", hashCode)).toString().substring(0, 8);
}
/**
* 解析aa=bb&cc=dd&ee=ff格式的字符串返回HashMap
*
* @param urlencoded
* @return
*/
public static Map<String, String> parseUrlencoded(String urlencoded) {
if (isEmpty(urlencoded)) {
return null;
}
String[] entrys = urlencoded.split("&");
if (isEmpty(entrys)) {
return null;
}
Map<String, String> map = new HashMap<String, String>(16);
String[] kv = null;
for (String entry : entrys) {
if (isEmpty(entry)) {
continue;
}
kv = entry.split("=");
if (isEmpty(kv)) {
continue;
}
if (kv.length > 1) {
map.put(kv[0], kv[1]);
} else {
map.put(kv[0], null);
}
}
return map;
return num.append(String.format("%010d", hashCode)).substring(0, 8);
}
/**
@@ -152,15 +117,15 @@ public final class StrUtil {
* @return 转换后字符串
*/
public static String toHex(byte[] buf) {
StringBuffer strbuf = new StringBuffer(buf.length * 2);
StringBuilder sb = new StringBuilder(buf.length * 2);
int i;
for (i = 0; i < buf.length; i++) {
if (((int) buf[i] & 0xff) < 0x10) {
strbuf.append("0");
sb.append("0");
}
strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
sb.append(Long.toString((int) buf[i] & 0xff, 16));
}
return strbuf.toString();
return sb.toString();
}
/**
@@ -227,11 +192,7 @@ public final class StrUtil {
*/
public static String iso2utf(String str) {
String utfStr = null;
try {
utfStr = new String(str.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
utfStr = new String(str.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
return utfStr;
}
@@ -241,21 +202,18 @@ public final class StrUtil {
* @param str
* @return
*/
private static Pattern pattern = Pattern.compile("[0-9]*");
private static final Pattern pattern = Pattern.compile("[0-9]*");
public static boolean isNumeric(String str) {
Matcher isNum = pattern.matcher(str);
if (!isNum.matches()) {
return false;
}
return true;
return isNum.matches();
}
/**
* 对ID32位进行编码
*
* @param id
* @return
* @param id 32位ID
* @return 编码后的64位ID
*/
public static String codeId(String id) {
if (id == null || id.length() != 32) {
@@ -267,7 +225,7 @@ public final class StrUtil {
for (int i = 0; i < 13; i++) {
coded.append(HEX_CHAR[random.nextInt(16)]);
}
coded.append(id.substring(0, 11));
coded.append(id, 0, 11);
for (int i = 0; i < 7; i++) {
coded.append(HEX_CHAR[random.nextInt(16)]);
}
@@ -282,8 +240,8 @@ public final class StrUtil {
/**
* 对ID32位进行解码
*
* @param coded
* @return
* @param coded 编码后的64位ID
* @return 解码后的32位ID
*/
public static String decodeId(String coded) {
if (coded == null || coded.length() != 64) {
@@ -291,12 +249,46 @@ public final class StrUtil {
}
StringBuilder id = new StringBuilder();
id.append(coded.substring(13, 24));
id.append(coded.substring(31, 52));
id.append(coded, 13, 24);
id.append(coded, 31, 52);
return id.toString();
}
/**
* 解析aa=bb&cc=dd&ee=ff格式的字符串返回HashMap
*
* @param urlencoded
* @return
*/
public static Map<String, String> parseUrlencoded(String urlencoded) {
if (isEmpty(urlencoded)) {
return null;
}
String[] entrys = urlencoded.split("&");
if (isEmpty(entrys)) {
return null;
}
Map<String, String> map = new HashMap<>(16);
String[] kv = null;
for (String entry : entrys) {
if (isEmpty(entry)) {
continue;
}
kv = entry.split("=");
if (isEmpty(kv)) {
continue;
}
if (kv.length > 1) {
map.put(kv[0], kv[1]);
} else {
map.put(kv[0], null);
}
}
return map;
}
/**
* map parameters 转url parameters
*
@@ -304,16 +296,15 @@ public final class StrUtil {
* @return
*/
public static String getSignContent(Map<String, ?> sortedParams) {
StringBuffer content = new StringBuffer();
StringBuilder content = new StringBuilder();
List<String> keys = new ArrayList<>(sortedParams.keySet());
Collections.sort(keys);
int index = 0;
for (int i = 0; i < keys.size(); ++i) {
String key = keys.get(i);
for (String key : keys) {
Object value = sortedParams.get(key);
if (isNotEmpty(key) && isNotEmpty(value)) {
content.append((index == 0 ? "" : "&") + key + "=" + value);
content.append(index == 0 ? "" : "&").append(key).append("=").append(value);
++index;
}
}
@@ -344,8 +335,7 @@ public final class StrUtil {
List<String> keys = new ArrayList<>(sortedParams.keySet());
Collections.sort(keys);
int index = 0;
for (int i = 0; i < keys.size(); ++i) {
String key = keys.get(i);
for (String key : keys) {
Object value = sortedParams.get(key);
map.put(key, value);
++index;
@@ -370,7 +360,7 @@ public final class StrUtil {
/**
* 下划线字符
*/
public static final char UNDERLINE = '_';
private static final char UNDERLINE = '_';
/**
* 字符串下划线转驼峰格式
@@ -419,4 +409,68 @@ public final class StrUtil {
}
return sb.toString();
}
private static final String NEW_LINE = "\n";
private static final String ERROR_MESSAGE_FORMAT = "%s.%s(%s:%d)";
/**
* 把异常堆栈信息转化为字符串,同时把所有的errorMessage用\n方式拼接到printStackTrace前面 -> 替代 e.printStackTrace()
* <p>使用e.printStackTrace()不能作为字符串处理本方法可以转换e.printStackTrace()为字符串</p>
* <p><b>printStackTrace</b>信息从<i>Caused by:</i>C开始</p>
*
* @param cause
* @return
*/
public static String printStackTraceAndMessage(Throwable cause) {
if (cause != null) {
StringBuilder msg = new StringBuilder();
if (isNotEmpty(cause.getMessage())) {
msg.append(cause.getMessage()).append(NEW_LINE);
}
String causedMsg = printStackTrace(cause, (eMessage) -> {
if (isNotEmpty(eMessage)) {
msg.append(eMessage).append(NEW_LINE);
}
});
return msg.append(causedMsg).toString();
}
return "";
}
/**
* 把异常堆栈信息转化为字符串 -> 替代 e.printStackTrace()
* <p>使用e.printStackTrace()不能作为字符串处理本方法可以转换e.printStackTrace()为字符串</p>
*
* @param cause
* @return
*/
public static String printStackTrace(Throwable cause) {
return printStackTrace(cause, (eMessage) -> {
});
}
private static String printStackTrace(Throwable cause, Consumer<String> consumer) {
if (cause != null) {
StringBuilder sb = new StringBuilder();
String cClass = cause.getClass().getName();
String eMessage = cause.getMessage();
StackTraceElement[] stackTrace = cause.getStackTrace();
Throwable caused = cause.getCause();
while (caused != null) {
cClass = caused.getClass().getName();
eMessage = caused.getMessage();
stackTrace = caused.getStackTrace();
caused = caused.getCause();
consumer.accept(eMessage);
}
sb.append("Caused by: ").append(cClass).append(": ").append(eMessage).append(NEW_LINE);
for (StackTraceElement element : stackTrace) {
sb.append("\tat ");
sb.append(String.format(ERROR_MESSAGE_FORMAT, element.getClassName(), element.getMethodName(), element.getFileName(), element.getLineNumber()));
sb.append(NEW_LINE);
}
return sb.toString();
}
return "";
}
}

View File

@@ -3,7 +3,15 @@ package com.yexuejc.base.util;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.net.URL;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* 系统工具类
@@ -14,6 +22,7 @@ import java.util.concurrent.*;
* @date: 2017/12/28 16:12
*/
public class SysUtil {
private static final Logger logger = Logger.getLogger(SysUtil.class.getName());
private static final String PROJECT_ROOT_PATH = "java.io.tmpdir";
private SysUtil() {
@@ -34,8 +43,8 @@ public class SysUtil {
* @param clazz
* @return
*/
public static URL getRootPath(Class clazz, String filePath) {
return clazz.getClass().getResource(StrUtil.setStr(filePath, "/"));
public static URL getRootPath(Class<?> clazz, String filePath) {
return clazz.getResource(StrUtil.setStr(filePath, "/"));
}
/**
@@ -64,9 +73,7 @@ public class SysUtil {
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
singleThreadPool.execute(() -> {
threadRun.execute();
});
singleThreadPool.execute(threadRun::execute);
singleThreadPool.shutdown();
}
@@ -79,4 +86,116 @@ public class SysUtil {
*/
void execute();
}
/**
* 获取当前JVM所有线程
*
* @return
*/
public static List<Thread> getThreadList() {
List<Thread> threadList = new ArrayList<>();
ThreadGroup currentGroup = Thread.currentThread().getThreadGroup();
while (currentGroup.getParent() != null) {
currentGroup = currentGroup.getParent();
}
int activeCount = currentGroup.activeCount();
Thread[] threads = new Thread[activeCount];
currentGroup.enumerate(threads);
for (Thread thread : threads) {
threadList.add(thread);
}
return threadList;
}
/** 线程锁 */
private static final Lock THREAD_LOCK = new ReentrantLock();
/** 已经等待的时间 */
private static final AtomicInteger SLEEP_TIME = new AtomicInteger(0);
/** 最大等待3分钟 */
private static final int MAX_SLEEP_TIME = 180;
/**
* 通过锁的方式判断jvm的内存如果超80%就等待最大3分钟JVM内存降低到80%再执行
*/
public static void checkJvmMemory() {
THREAD_LOCK.lock();
try {
while (jvmMemoryIsNotExecutable()) {
//jvm内存使用率达到80%,阻塞所有线程最大等待3分钟后放开
if (SLEEP_TIME.incrementAndGet() < MAX_SLEEP_TIME) {
TimeUnit.SECONDS.sleep(1);
} else {
break;
}
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
THREAD_LOCK.unlock();
SLEEP_TIME.set(0);
}
}
/**
* jvm内存是否大于80%(不能继续执行)
*
* @return true:是false:不是
*/
public static boolean jvmMemoryIsNotExecutable() {
Runtime runtime = Runtime.getRuntime();
//jvm总内存
long jvmTotalMemoryByte = runtime.totalMemory();
//jvm最大可申请
long jvmMaxMemoryByte = runtime.maxMemory();
//空闲空间
long freeMemoryByte = runtime.freeMemory();
double rate = (jvmTotalMemoryByte - freeMemoryByte) * 1.0 / jvmTotalMemoryByte;
if (rate >= 0.8) {
rate = (jvmTotalMemoryByte - freeMemoryByte) * 1.0 / jvmMaxMemoryByte;
if (rate >= 0.8) {
//jvm内存使用率达到80%
print(jvmTotalMemoryByte, jvmMaxMemoryByte, freeMemoryByte);
return true;
}
}
return false;
}
private static final DecimalFormat RATE_DECIMAL_FORMAT = new DecimalFormat("#.##%");
private static void print(long jvmTotalMemoryByte, long jvmMaxMemoryByte, long freeMemoryByte) {
if (logger.isLoggable(Level.WARNING)) {
String sb = "\n=========================================================" +
"\nThread Name = " + Thread.currentThread().getName() +
"\nJVM Memory = " + formatByte(jvmTotalMemoryByte) +
"\nJVM Max Memory = " + formatByte(jvmMaxMemoryByte) +
"\nJVM Used Memory = " + formatByte(jvmTotalMemoryByte - freeMemoryByte) +
"\nJVM Free Memory = " + formatByte(freeMemoryByte) +
"\nJVM Memory Rate = " + RATE_DECIMAL_FORMAT.format((jvmTotalMemoryByte - freeMemoryByte) * 1.0 / jvmTotalMemoryByte) +
"\n=========================================================";
logger.warning(sb);
}
}
private static String formatByte(long byteNumber) {
//换算单位
double format = 1024.0;
double kbNumber = byteNumber / format;
if (kbNumber < format) {
return new DecimalFormat("#.##KB").format(kbNumber);
}
double mbNumber = kbNumber / format;
if (mbNumber < format) {
return new DecimalFormat("#.##MB").format(mbNumber);
}
double gbNumber = mbNumber / format;
if (gbNumber < format) {
return new DecimalFormat("#.##GB").format(gbNumber);
}
double tbNumber = gbNumber / format;
return new DecimalFormat("#.##TB").format(tbNumber);
}
}

View File

@@ -0,0 +1,70 @@
package com.yexuejc.base.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Date;
import java.util.Locale;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class DateUtilTest {
@Test
public void testParseDate() throws ParseException {
String dateStr = "2022-03-20";
String dateFormat = "yyyy-MM-dd";
Date date = DateUtil.parseDate(dateStr, dateFormat);
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
assertEquals(sdf.format(date), dateStr);
}
@Test
public void testParseLocalDate() throws ParseException {
String dateStr = "2022-03-20";
String dateFormat = "yyyy-MM-dd";
LocalDate date = DateTimeUtil.parseLocalDate(DateUtil.parseDate(dateStr, dateFormat));
assertEquals(date.toString(), dateStr);
}
@Test
public void testFormatDateNow() {
String dateFormat = "yyyy-MM-dd";
String nowDateStr = DateUtil.formatDateNow(dateFormat);
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
String nowDate = sdf.format(new Date());
assertEquals(nowDate, nowDateStr);
}
@Test
public void testFormatDate() {
Date date = new Date();
String dateFormat = "yyyy-MM-dd";
String formattedDate = DateUtil.formatDate(date, dateFormat);
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
assertEquals(sdf.format(date), formattedDate);
}
@Test
public void testFormatDateWithLocale() {
Date date = new Date();
String dateFormat = "yyyy-MM-dd";
Locale locale = Locale.JAPAN;
String formattedDate = DateUtil.formatDate(date, dateFormat, locale);
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, locale);
assertEquals(sdf.format(date), formattedDate);
}
@Test
public void testGetDateByPlusDay() {
int days = 2;
String dateFormat = "yyyy-MM-dd";
String plusDateStr = DateUtil.formatDate(DateUtil.datePlus(new Date(), days), dateFormat);
LocalDate nowDate = LocalDate.now();
LocalDate plusDate = nowDate.plusDays(days);
assertEquals(plusDate.toString(), plusDateStr);
}
}

View File

@@ -0,0 +1,117 @@
package com.yexuejc.base.util;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import com.yexuejc.base.pojo.ReadFileBean;
import com.yexuejc.base.util.bean.AppnodeCertCsvBean;
/**
*
* @author: yexuejc
* @date: 2024/4/8 11:33
*/
public class FileUtilTest {
public static void main(String[] args) throws IOException {
readCsvFile();
// other();
}
private static void other() throws IOException {
System.out.println(FileUtil.getFileType("C:\\Users\\Administrator\\Desktop\\test.txt"));
boolean b = FileUtil.judeDirExists(new File("F:\\coding\\yexuejc-base2\\src\\test\\java\\com\\yexuejc\\base\\util\\test\\a"));
File file = new File("F:\\coding\\yexuejc-base2\\src\\test\\java\\com\\yexuejc\\base\\util\\test\\a\\test.txt");
FileUtil.judeFileExists(file);
System.out.println("创建文件夹:" + b);
System.out.println("SHA1:" + FileUtil.sha1(file));
//超大文件sha1
long l = System.currentTimeMillis();
System.out.println("SHA1:" + FileUtil.sha1(Paths.get("F:\\Docker\\win\\win10x64.iso").toFile()) + " 花费时间:" + (System.currentTimeMillis() - l));
System.out.println("MD5:" + FileUtil.md5(file));
//超大文件MD5
long l2 = System.currentTimeMillis();
System.out.println("MD5:" + FileUtil.md5(Paths.get("F:\\Docker\\win\\win10x64.iso").toFile()) + " 花费时间:" + (System.currentTimeMillis() - l2));
//超大文件MD5
long l3 = System.currentTimeMillis();
System.out.println("CRC32:" + FileUtil.crc32(Paths.get("F:\\Docker\\win\\win10x64.iso").toFile()) + " 花费时间:" + (System.currentTimeMillis() - l3));
String base64ToStr = FileUtil.base64ToStr(file);
System.out.println(base64ToStr);
String fileName = "F:\\coding\\yexuejc-base2\\src\\test\\java\\com\\yexuejc\\base\\util\\test\\a\\test2.txt";
System.out.println(FileUtil.base64ToFile(base64ToStr, fileName));
File file2 = Paths.get(fileName).toFile();
System.out.println("SHA1:" + FileUtil.sha1(file2));
System.out.println("MD5:" + FileUtil.md5(file2));
System.out.println(FileUtil.size(file2.toPath()));
long l4 = System.currentTimeMillis();
System.out.println(FileUtil.size(Paths.get("F:\\Docker\\win\\win10x64.iso")) + " 花费时间:" + (System.currentTimeMillis() - l4));
}
private static void readCsvFile() throws IOException {
String path = "F:\\coding\\yexuejc-base\\src\\test\\java\\com\\yexuejc\\base\\util\\test.csv";
// List<AppnodeCertCsvBean> list = FileUtil.readCsv(path, AppnodeCertCsvBean.class, true, "enable,domain,protocol,deployHost,deployPath,uname,pwd,appnodeId", ',');
// System.out.println("***********************************************");
// System.out.println(JsonUtil.formatPrinter(list));
// System.out.println("条数:" + list.size());
//直接把每行读取成字符串
ReadFileBean<String> readFileBean2 = new ReadFileBean<>(2);
ReadFileBean<String> bean2 = FileUtil.readBigFile(path, readFileBean2);
System.out.println("直接把每行读取成字符串============================================");
System.out.println(JsonUtil.formatPrinter(bean2));
System.out.println("直接把每行读取成字符串============================================");
//自定义每行数据的处理
ReadFileBean<AppnodeCertCsvBean> readFileBean1 = new ReadFileBean<>(2);
ReadFileBean<AppnodeCertCsvBean> bean1 = FileUtil.readBigFile(path, readFileBean1, datas -> {
if (readFileBean1.getStartRowNum() == 1) {
datas.remove(0);//跳过第一行
}
return datas.stream().map(str -> {
//自定义处理每一条数据
String[] split = str.split(",");
AppnodeCertCsvBean app = new AppnodeCertCsvBean();
app.setEnable(getValue(split, 0));
app.setDomain(getValue(split, 1));
app.setProtocol(getValue(split, 2));
app.setDeployHost(getValue(split, 3));
app.setDeployPath(getValue(split, 4));
app.setUname(getValue(split, 5));
app.setPwd(getValue(split, 6));
if (StrUtil.isNotEmpty(getValue(split, 7))) {
app.setAppnodeId(Integer.valueOf(getValue(split, 7)));
}
return app;
}).collect(Collectors.toList());
});
System.out.println("自定义每行数据的处理============================================");
System.out.println(JsonUtil.formatPrinter(bean1));
System.out.println("自定义每行数据的处理============================================");
//直接使用提供的csv文件读取
ReadFileBean<AppnodeCertCsvBean> readFileBean = new ReadFileBean<>(2);
do {
ReadFileBean<AppnodeCertCsvBean> bean = FileUtil.readBigFile(path, readFileBean, AppnodeCertCsvBean.class);
System.out.println("直接使用提供的csv文件读取============================================");
System.out.println(JsonUtil.formatPrinter(bean));
System.out.println("直接使用提供的csv文件读取============================================");
} while (readFileBean.hasNext());
}
private static String getValue(String[] value, int index) {
try {
return value[index];
} catch (Exception e) {
return "";
}
}
}

View File

@@ -0,0 +1,22 @@
package com.yexuejc.base.util;
/**
*
* @author: yexuejc
* @date: 2024/4/8 11:22
*/
public class SysUtilTest {
public static void main(String[] args) {
System.out.println(SysUtil.getCachePath());
System.out.println(SysUtil.getRootPath(SysUtilTest.class, null));
SysUtil.threadRun("test", () -> {
String threadName = Thread.currentThread().getName();
System.out.println("当前线程的名称是:" + threadName);
});
SysUtil.getThreadList().forEach(t -> {
System.out.println("线程名称:" + t.getName());
});
SysUtil.checkJvmMemory();
System.out.println(SysUtil.jvmMemoryIsNotExecutable());
}
}

View File

@@ -0,0 +1,108 @@
package com.yexuejc.base.util.bean;
import java.io.Serializable;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.yexuejc.base.annotation.CsvToBean;
import com.yexuejc.base.converter.IntegerNullValueDeserializer;
/**
*
* @author: yexuejc
* @date: 2024/2/27 10:40
*/
@CsvToBean(header = "enable,domain,protocol,deployHost,deployPath,uname,pwd,appnodeId")
public class AppnodeCertCsvBean implements Serializable {
/**是否生效Y/N*/
private String enable;
/**域名*/
private String domain;
/**
* 部署协议
* appnode
* ssh
* */
private String protocol;
/**
* 部署服务器
* 部署协议appnode: local 本机部署
* 部署协议appnode: 域名 部署的远程appnode域名
* 部署协议ssh : IP
* */
private String deployHost;
/**部署证书位置*/
private String deployPath;
/**服务器账号*/
private String uname;
/**服务器密码*/
private String pwd;
/**
* appnode协议时且远程部署时对应的远程appnode的ApiNodeId
*/
@JsonDeserialize(using = IntegerNullValueDeserializer.class)
private Integer appnodeId;
public String getEnable() {
return enable;
}
public void setEnable(String enable) {
this.enable = enable;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
public String getProtocol() {
return protocol;
}
public void setProtocol(String protocol) {
this.protocol = protocol;
}
public String getDeployHost() {
return deployHost;
}
public void setDeployHost(String deployHost) {
this.deployHost = deployHost;
}
public String getDeployPath() {
return deployPath;
}
public void setDeployPath(String deployPath) {
this.deployPath = deployPath;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public Integer getAppnodeId() {
return appnodeId;
}
public void setAppnodeId(Integer appnodeId) {
this.appnodeId = appnodeId;
}
}

View File

@@ -0,0 +1,10 @@
是否生效,域名,部署协议,部署服务器,部署证书位置,服务器账号,服务器密码,appnodeId
N,kasm.mx.yexuejc.top,appnode,http://192.168.56.101:8888,,admin,admin,1
N,kasm.mx.yexuejc.top,appnode,local,,,,
N,shop.mx.yexuejc.top,appnode,local,,,,
Y,cloud.yexuejc.top,ssh,118.126.109.109:10371,/home/frpuser/http/cert/,frpuser,yexuejc1,
Y,blog.yexuejc.top,ssh,118.126.109.109:10371,/home/frpuser/http/cert/,frpuser,yexuejc1,
Y,yexuejc.top,ssh,118.126.109.109:10371,/home/frpuser/http/cert/,frpuser,yexuejc1,
Y,jenkins.yexuejc.top,ssh,118.126.109.109:10371,/home/frpuser/http/cert/,frpuser,yexuejc1,
Y,git.yexuejc.top,ssh,118.126.109.109:10371,/home/frpuser/http/cert/,frpuser,yexuejc1,
Y,nexus.yexuejc.top,ssh,118.126.109.109:10371,/home/frpuser/http/cert/,frpuser,yexuejc1,
1 是否生效 域名 部署协议 部署服务器 部署证书位置 服务器账号 服务器密码 appnodeId
2 N kasm.mx.yexuejc.top appnode http://192.168.56.101:8888 admin admin 1
3 N kasm.mx.yexuejc.top appnode local
4 N shop.mx.yexuejc.top appnode local
5 Y cloud.yexuejc.top ssh 118.126.109.109:10371 /home/frpuser/http/cert/ frpuser yexuejc1
6 Y blog.yexuejc.top ssh 118.126.109.109:10371 /home/frpuser/http/cert/ frpuser yexuejc1
7 Y yexuejc.top ssh 118.126.109.109:10371 /home/frpuser/http/cert/ frpuser yexuejc1
8 Y jenkins.yexuejc.top ssh 118.126.109.109:10371 /home/frpuser/http/cert/ frpuser yexuejc1
9 Y git.yexuejc.top ssh 118.126.109.109:10371 /home/frpuser/http/cert/ frpuser yexuejc1
10 Y nexus.yexuejc.top ssh 118.126.109.109:10371 /home/frpuser/http/cert/ frpuser yexuejc1