mirror of
https://gitee.com/jzsw-it/yexuejc-base.git
synced 2025-11-19 05:47:45 +08:00
Compare commits
7 Commits
1.5.1-jre1
...
41a9f1b507
| Author | SHA1 | Date | |
|---|---|---|---|
| 41a9f1b507 | |||
| bf731e753a | |||
| 8d5e653d2b | |||
| c4fc4bd4f8 | |||
|
|
667ad26971 | ||
|
|
a260b41fae | ||
|
|
0754660c45 |
@@ -120,4 +120,8 @@ public class ReadFileBean<T> {
|
|||||||
public String lineScavenge(String lineData) {
|
public String lineScavenge(String lineData) {
|
||||||
return this.lineScavenger.apply(lineData);
|
return this.lineScavenger.apply(lineData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasNext() {
|
||||||
|
return this.fileLength > this.pointer;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -504,7 +504,7 @@ public class FileUtil {
|
|||||||
List<String> datas = new ArrayList<>();
|
List<String> datas = new ArrayList<>();
|
||||||
int row = 1;
|
int row = 1;
|
||||||
String line;
|
String line;
|
||||||
while ((line = randomAccessFile.readLine()) != null && row < readFileBean.getReadRowNum()) {
|
while ((line = randomAccessFile.readLine()) != null && row <= readFileBean.getReadRowNum()) {
|
||||||
row++;
|
row++;
|
||||||
readFileBean.setPointer(randomAccessFile.getFilePointer());
|
readFileBean.setPointer(randomAccessFile.getFilePointer());
|
||||||
datas.add(readFileBean.lineScavenge(charsetDecode(line, readFileBean.getReadCharset()))); }
|
datas.add(readFileBean.lineScavenge(charsetDecode(line, readFileBean.getReadCharset()))); }
|
||||||
|
|||||||
@@ -6,11 +6,23 @@ import com.fasterxml.jackson.core.JsonParseException;
|
|||||||
import com.fasterxml.jackson.core.JsonParser;
|
import com.fasterxml.jackson.core.JsonParser;
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import com.fasterxml.jackson.core.type.TypeReference;
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
import com.fasterxml.jackson.databind.*;
|
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.json.JsonMapper;
|
||||||
import com.fasterxml.jackson.databind.type.MapType;
|
import com.fasterxml.jackson.databind.type.MapType;
|
||||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||||
import com.yexuejc.base.converter.*;
|
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;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
@@ -179,11 +191,11 @@ public class JsonUtil {
|
|||||||
try {
|
try {
|
||||||
pojo = jsonMapper.readValue(json, cls);
|
pojo = jsonMapper.readValue(json, cls);
|
||||||
} catch (JsonParseException e) {
|
} catch (JsonParseException e) {
|
||||||
log.warning("json to Object JsonParseException.\n" + e.getMessage());
|
log.warning("json to Object JsonParseException.\n" + e);
|
||||||
} catch (JsonMappingException 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) {
|
} catch (IOException e) {
|
||||||
log.warning("json to Object IOException.\n" + e.getMessage());
|
log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
return pojo;
|
return pojo;
|
||||||
@@ -201,13 +213,13 @@ public class JsonUtil {
|
|||||||
try {
|
try {
|
||||||
pojo = jsonMapper.readValue(json, cls);
|
pojo = jsonMapper.readValue(json, cls);
|
||||||
} catch (JsonParseException e) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
log.warning("json to Object Exception.\n" + StrUtil.printStackTrace(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
return pojo;
|
return pojo;
|
||||||
@@ -227,11 +239,11 @@ public class JsonUtil {
|
|||||||
try {
|
try {
|
||||||
pojo = jsonMapper.readValue(json, javaType);
|
pojo = jsonMapper.readValue(json, javaType);
|
||||||
} catch (JsonParseException e) {
|
} 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) {
|
} 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) {
|
} catch (IOException e) {
|
||||||
log.warning("json to Object IOException.\n" + e.getMessage());
|
log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e));
|
||||||
}
|
}
|
||||||
return pojo;
|
return pojo;
|
||||||
}
|
}
|
||||||
@@ -252,11 +264,11 @@ public class JsonUtil {
|
|||||||
try {
|
try {
|
||||||
pojo = jsonMapper.readValue(json, mapType);
|
pojo = jsonMapper.readValue(json, mapType);
|
||||||
} catch (JsonParseException e) {
|
} 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) {
|
} 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) {
|
} catch (IOException e) {
|
||||||
log.warning("json to Object IOException.\n" + e.getMessage());
|
log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e));
|
||||||
}
|
}
|
||||||
return pojo;
|
return pojo;
|
||||||
}
|
}
|
||||||
@@ -273,7 +285,7 @@ public class JsonUtil {
|
|||||||
try {
|
try {
|
||||||
return jsonMapper.readValue(json, javaType);
|
return jsonMapper.readValue(json, javaType);
|
||||||
} catch (JsonProcessingException e) {
|
} catch (JsonProcessingException e) {
|
||||||
log.warning("json to Object JsonParseException.\n" + e.getMessage());
|
log.warning("json to Object JsonParseException.\n" + StrUtil.printStackTrace(e));
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -293,11 +305,11 @@ public class JsonUtil {
|
|||||||
try {
|
try {
|
||||||
pojo = jsonMapper.readValue(json, javaType);
|
pojo = jsonMapper.readValue(json, javaType);
|
||||||
} catch (JsonParseException e) {
|
} 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) {
|
} 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) {
|
} catch (IOException e) {
|
||||||
log.warning("json to Object IOException.\n" + e.getMessage());
|
log.warning("json to Object IOException.\n" + StrUtil.printStackTrace(e));
|
||||||
}
|
}
|
||||||
return pojo;
|
return pojo;
|
||||||
}
|
}
|
||||||
@@ -313,7 +325,7 @@ public class JsonUtil {
|
|||||||
try {
|
try {
|
||||||
json = jsonMapper.writeValueAsString(pojo);
|
json = jsonMapper.writeValueAsString(pojo);
|
||||||
} catch (JsonProcessingException e) {
|
} catch (JsonProcessingException e) {
|
||||||
log.warning("json to Object JsonProcessingException.\n" + e.getMessage());
|
log.warning("json to Object JsonProcessingException.\n" + StrUtil.printStackTrace(e));
|
||||||
}
|
}
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
@@ -329,8 +341,9 @@ public class JsonUtil {
|
|||||||
try {
|
try {
|
||||||
json = jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
|
json = jsonMapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
|
||||||
} catch (JsonProcessingException e) {
|
} catch (JsonProcessingException e) {
|
||||||
log.warning("json to Object JsonProcessingException.\n" + e.getMessage());
|
log.warning("json to Object JsonProcessingException.\n" + StrUtil.printStackTrace(e));
|
||||||
}
|
}
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -4,9 +4,13 @@ import com.yexuejc.base.annotation.ToUeProperty;
|
|||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
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
|
* @date 2018/12/28 15:54
|
||||||
*/
|
*/
|
||||||
public class ObjUtil {
|
public class ObjUtil {
|
||||||
|
private static Logger log = Logger.getLogger(ObjUtil.class.getName());
|
||||||
|
|
||||||
private ObjUtil() {
|
private ObjUtil() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -260,4 +266,150 @@ public class ObjUtil {
|
|||||||
return outer;
|
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,20 @@
|
|||||||
package com.yexuejc.base.util;
|
package com.yexuejc.base.util;
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.http.HttpClient;
|
||||||
|
import java.net.http.HttpRequest;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
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.Random;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.function.Consumer;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@@ -19,7 +30,7 @@ public final class StrUtil {
|
|||||||
private 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'};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断字符串,数组,集合 是否为空
|
* 判断字符串,数组,集合 是否为空
|
||||||
@@ -111,40 +122,6 @@ public final class StrUtil {
|
|||||||
return num.append(String.format("%010d", hashCode)).toString().substring(0, 8);
|
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进制字符串
|
* 字符串转换方法 把字节数组转换成16进制字符串
|
||||||
*
|
*
|
||||||
@@ -254,8 +231,8 @@ public final class StrUtil {
|
|||||||
/**
|
/**
|
||||||
* 对ID(32位)进行编码
|
* 对ID(32位)进行编码
|
||||||
*
|
*
|
||||||
* @param id
|
* @param id 32位ID
|
||||||
* @return
|
* @return 编码后的64位ID
|
||||||
*/
|
*/
|
||||||
public static String codeId(String id) {
|
public static String codeId(String id) {
|
||||||
if (id == null || id.length() != 32) {
|
if (id == null || id.length() != 32) {
|
||||||
@@ -282,8 +259,8 @@ public final class StrUtil {
|
|||||||
/**
|
/**
|
||||||
* 对ID(32位)进行解码
|
* 对ID(32位)进行解码
|
||||||
*
|
*
|
||||||
* @param coded
|
* @param coded 编码后的64位ID
|
||||||
* @return
|
* @return 解码后的32位ID
|
||||||
*/
|
*/
|
||||||
public static String decodeId(String coded) {
|
public static String decodeId(String coded) {
|
||||||
if (coded == null || coded.length() != 64) {
|
if (coded == null || coded.length() != 64) {
|
||||||
@@ -297,6 +274,40 @@ public final class StrUtil {
|
|||||||
return id.toString();
|
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
|
* map parameters 转url parameters
|
||||||
*
|
*
|
||||||
@@ -370,7 +381,7 @@ public final class StrUtil {
|
|||||||
/**
|
/**
|
||||||
* 下划线字符
|
* 下划线字符
|
||||||
*/
|
*/
|
||||||
public static final char UNDERLINE = '_';
|
private static final char UNDERLINE = '_';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 字符串下划线转驼峰格式
|
* 字符串下划线转驼峰格式
|
||||||
@@ -419,4 +430,69 @@ public final class StrUtil {
|
|||||||
}
|
}
|
||||||
return sb.toString();
|
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 "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user