mirror of
https://gitee.com/jzsw-it/yexuejc-base.git
synced 2026-01-07 15:22:13 +08:00
Compare commits
13 Commits
1.5.1-jre1
...
2031a3aadf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2031a3aadf | ||
|
|
b6ffffef71 | ||
| 601611a11f | |||
| 8d364b99f2 | |||
| 127c6902bf | |||
| 007d8d2f16 | |||
| 41a9f1b507 | |||
| bf731e753a | |||
| 8d5e653d2b | |||
| c4fc4bd4f8 | |||
|
|
667ad26971 | ||
|
|
a260b41fae | ||
|
|
0754660c45 |
41
README.md
41
README.md
@@ -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. 支持环境:java8(1.5.0开始支持java11,请使用`x.x.x-jre11`版本)
|
||||
1. 支持环境:java11(1.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)
|
||||
|
||||
|
||||
10
UPDATE.md
10
UPDATE.md
@@ -1,6 +1,16 @@
|
||||
yexuejc-base 更新记录
|
||||
------------------
|
||||
|
||||
#### version :1.5.2-jre11
|
||||
**time:2024-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)中提取出来
|
||||
|
||||
---
|
||||
|
||||
|
||||
#### version :1.5.1-jre11
|
||||
**time:2023-6-8 16:02:56** <br/>
|
||||
**branch:** jre11 <br/>
|
||||
|
||||
31
pom.xml
31
pom.xml
@@ -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>
|
||||
|
||||
254
src/main/java/com/yexuejc/base/file/FileInput.java
Normal file
254
src/main/java/com/yexuejc/base/file/FileInput.java
Normal 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);
|
||||
}*/
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +1,11 @@
|
||||
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.channels.FileChannel;
|
||||
@@ -35,11 +17,16 @@ import java.security.NoSuchAlgorithmException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Base64;
|
||||
import java.util.List;
|
||||
import java.util.Scanner;
|
||||
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;
|
||||
|
||||
/**
|
||||
* 文件工具类
|
||||
*
|
||||
@@ -504,10 +491,11 @@ public class FileUtil {
|
||||
List<String> datas = new ArrayList<>();
|
||||
int row = 1;
|
||||
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()))); }
|
||||
datas.add(readFileBean.lineScavenge(charsetDecode(line, readFileBean.getReadCharset())));
|
||||
}
|
||||
|
||||
if (StrUtil.isEmpty(datas)) {
|
||||
//无数据
|
||||
@@ -572,223 +560,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);
|
||||
}*/
|
||||
}
|
||||
|
||||
@@ -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,11 @@ 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;
|
||||
}
|
||||
@@ -252,11 +265,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,7 +286,7 @@ 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;
|
||||
}
|
||||
@@ -293,11 +306,11 @@ 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;
|
||||
}
|
||||
@@ -313,7 +326,7 @@ public class JsonUtil {
|
||||
try {
|
||||
json = 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;
|
||||
}
|
||||
@@ -329,8 +342,9 @@ public class JsonUtil {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,9 +1,19 @@
|
||||
package com.yexuejc.base.util;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.lang.reflect.Array;
|
||||
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 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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,40 +110,6 @@ public final class StrUtil {
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 字符串转换方法 把字节数组转换成16进制字符串
|
||||
*
|
||||
@@ -254,8 +219,8 @@ public final class StrUtil {
|
||||
/**
|
||||
* 对ID(32位)进行编码
|
||||
*
|
||||
* @param id
|
||||
* @return
|
||||
* @param id 32位ID
|
||||
* @return 编码后的64位ID
|
||||
*/
|
||||
public static String codeId(String id) {
|
||||
if (id == null || id.length() != 32) {
|
||||
@@ -282,8 +247,8 @@ public final class StrUtil {
|
||||
/**
|
||||
* 对ID(32位)进行解码
|
||||
*
|
||||
* @param coded
|
||||
* @return
|
||||
* @param coded 编码后的64位ID
|
||||
* @return 解码后的32位ID
|
||||
*/
|
||||
public static String decodeId(String coded) {
|
||||
if (coded == null || coded.length() != 64) {
|
||||
@@ -297,6 +262,40 @@ public final class StrUtil {
|
||||
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<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;
|
||||
}
|
||||
|
||||
/**
|
||||
* map parameters 转url parameters
|
||||
*
|
||||
@@ -370,7 +369,7 @@ public final class StrUtil {
|
||||
/**
|
||||
* 下划线字符
|
||||
*/
|
||||
public static final char UNDERLINE = '_';
|
||||
private static final char UNDERLINE = '_';
|
||||
|
||||
/**
|
||||
* 字符串下划线转驼峰格式
|
||||
@@ -419,4 +418,69 @@ 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 "";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 Logger logger = Logger.getLogger(SysUtil.class.getName());
|
||||
private static final String PROJECT_ROOT_PATH = "java.io.tmpdir";
|
||||
|
||||
private SysUtil() {
|
||||
@@ -79,4 +88,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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user