1.Base64Util
/**
* Base64 工具类
*/
public class Base64Util {
private static final char last2byte = (char) Integer.parseInt("00000011", 2);
private static final char last4byte = (char) Integer.parseInt("00001111", 2);
private static final char last6byte = (char) Integer.parseInt("00111111", 2);
private static final char lead6byte = (char) Integer.parseInt("11111100", 2);
private static final char lead4byte = (char) Integer.parseInt("11110000", 2);
private static final char lead2byte = (char) Integer.parseInt("11000000", 2);
private static final char[] encodeTable = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
public Base64Util() {
}
public static String encode(byte[] from) {
StringBuilder to = new StringBuilder((int) ((double) from.length * 1.34D) + 3);
int num = 0;
char currentByte = 0;
int i;
for (i = 0; i < from.length; ++i) {
for (num %= 8; num < 8; num += 6) {
switch (num) {
case 0:
currentByte = (char) (from[i] & lead6byte);
currentByte = (char) (currentByte >>> 2);
case 1:
case 3:
case 5:
default:
break;
case 2:
currentByte = (char) (from[i] & last6byte);
break;
case 4:
currentByte = (char) (from[i] & last4byte);
currentByte = (char) (currentByte << 2);
if (i + 1 < from.length) {
currentByte = (char) (currentByte | (from[i + 1] & lead2byte) >>> 6);
}
break;
case 6:
currentByte = (char) (from[i] & last2byte);
currentByte = (char) (currentByte << 4);
if (i + 1 < from.length) {
currentByte = (char) (currentByte | (from[i + 1] & lead4byte) >>> 4);
}
}
to.append(encodeTable[currentByte]);
}
}
if (to.length() % 4 != 0) {
for (i = 4 - to.length() % 4; i > 0; --i) {
to.append("=");
}
}
return to.toString();
}
}
2.CommonUtil
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* <P>
* 通用工具类
* </p>
*
*/
public class CommonUtil {
public static String hiddenMobile(String mobile) {
if (StringUtils.isBlank(mobile)) {
return "";
}
return mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
}
/**
* @param s
* @param isFen
* @return
*/
public static BigDecimal strToBigDecimal(String s, Boolean isFen) {
if (StringUtils.isBlank(s)) {
return null;
}
if (!NumberUtils.isNumber(s)) {
return null;
}
BigDecimal bd = new BigDecimal(s);
if (isFen != null && isFen.booleanValue()){
bd = bd.divide(new BigDecimal(100), 2);
}
return bd;
}
public static final Pattern shiFenMiaoPattern = Pattern.compile("(\\d{1,2}[::]){0,2}\\d{1,2}");
public static Long shiFenMiaoToSeconds (String shifenmiao) {
if (StringUtils.isBlank(shifenmiao)) {
return 0L;
}
Long totalSeconds = 0L;
shifenmiao = shifenmiao.replaceAll(" ", "");
boolean matched = shiFenMiaoPattern.matcher(shifenmiao).matches();
if (matched) {
List<String> sfmList = new ArrayList<>();
StringTokenizer st = new StringTokenizer(shifenmiao,"::");
while (st.hasMoreTokens()) {
sfmList.add(st.nextToken());
}
Collections.reverse(sfmList);
String[] sfmArr = sfmList.toArray(new String[0]);
for (int i = 0; i < sfmArr.length; i++) {
if (i == 0) {
totalSeconds += Long.valueOf(sfmArr[i]);
} else if (i == 1) {
totalSeconds += Long.valueOf(sfmArr[i]) * 60;
} else if (i == 2) {
totalSeconds += Long.valueOf(sfmArr[i]) * 3600;
}
}
}
return totalSeconds;
}
/**
* 将下划线映射到骆驼命名使用的正则表达式, 预编译正则用于提高效率
*/
private static Pattern patternForUTC = Pattern.compile("_([a-z]){1}");
/**
* 将下划线映射到骆驼命名
*
* @param str
* @return
*/
public static String mapUnderscoreToCamelCase(String str) {
// 先转成全小写
str = str.toLowerCase();
final Matcher matcher = patternForUTC.matcher(str);
while (matcher.find()) {
str = str.replaceAll(matcher.group(), matcher.group(1).toUpperCase());
}
return str;
}
/**
* 将骆驼命名映射到下划线, 必须是标准的驼峰命名, 否则会出现奇怪的结果
*
* @param str
* @return
*/
public static String mapCamelCaseToUnderscore(String str) {
return str.replaceAll("([A-Z]){1}","_$1").toUpperCase();
}
public static void main(String[] args) {
Instant start = Instant.parse("2017-10-03T10:15:30.00Z");
Instant end = Instant.parse("2018-10-04T10:16:30.00Z");
LocalDateTime time1 = LocalDateTime.of(2019,8,8,8,8);
LocalDateTime time2 = LocalDateTime.of(2019,9,9,8,8);
Duration duration = Duration.between(time1, time2);
System.out.println(duration.getSeconds());
System.out.println(duration.isNegative());
System.out.println(time1.until(time2, ChronoUnit.SECONDS));
}
}
3.DateUtil
import org.apache.commons.lang.StringUtils;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
* 日期处理
*
*/
public class DateUtil {
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
public static final String YYYYMMDD = "yyyyMMdd";
public static final String HHmmss = "HHmmss";
public static final String YYYYMM = "yyyyMM";
private DateUtil() {
}
public static String toDateTime(LocalDateTime date) {
return toDateTime(date, YYYY_MM_DD_HH_MM_SS);
}
public static String toDateTime(LocalDateTime dateTime, String pattern) {
return dateTime.format(DateTimeFormatter.ofPattern(pattern, Locale.SIMPLIFIED_CHINESE));
}
public static String toDateText(LocalDate date, String pattern) {
if (date == null || pattern == null) {
return null;
}
return date.format(DateTimeFormatter.ofPattern(pattern, Locale.SIMPLIFIED_CHINESE));
}
/**
* 从给定的date,加上hour小时 求指定date时间后hour小时的时间
*
* @param date 指定的时间
* @param hour 多少小时后
* @return
*/
public static Date addExtraHour(Date date, int hour) {
Calendar cal = Calendar.getInstance();
if (date != null) {
cal.setTime(date);
}
cal.add(Calendar.HOUR_OF_DAY, hour);
return cal.getTime();
}
/**
* 从给定的date,加上increase天
*
* @param date
* @param increase
* @return
*/
public static Date increaseDay2Date(Date date, int increase) {
Calendar cal = Calendar.getInstance();
if (date != null) {
cal.setTime(date);
}
cal.add(Calendar.DAY_OF_MONTH, increase);
return cal.getTime();
}
/**
* 从给定的LocalDateTime,加上increase月
*
* @param date
* @param increase
* @return
*/
public static LocalDateTime localDateTimeAddMonth(LocalDateTime date, int increase) {
// LocalDateTime --> Date
Date temp = Date.from(date.atZone(ZoneId.systemDefault()).toInstant());
// 日期加
Calendar cal = Calendar.getInstance();
if (temp != null) {
cal.setTime(temp);
}
cal.add(Calendar.MONTH, increase);
// LocalDateTime <-- Date
return LocalDateTime.ofInstant(cal.getTime().toInstant(), ZoneId.systemDefault());
}
/**
* 把字符串日期默认转换为yyyy-mm-dd格式的Data对象
*
* @param strDate
* @return
*/
public static Date format(String strDate, String format) {
Date d = null;
if (null == strDate || "".equals(strDate))
return null;
else
try {
d = getFormatter(format).parse(strDate);
} catch (ParseException pex) {
return null;
}
return d;
}
/**
* 获取一个简单的日期格式化对象
*
* @return 一个简单的日期格式化对象
*/
private static SimpleDateFormat getFormatter(String parttern) {
return new SimpleDateFormat(parttern);
}
/**
* 获取month所在月的所有天
*
* @param month 要查询的日期(如果为null 则默认为当前月)
* @param dateFormat 返回日期的格式(如果为null 则返回yyyy-MM-dd 格式结果)
* @return
*/
public static List<String> getAllDaysOfMonthInString(Date month, DateFormat dateFormat) {
List<String> rs = new ArrayList<String>();
DateFormat df = null;
if (null == dateFormat) {
df = new SimpleDateFormat("yyyy-MM-dd");
}
Calendar cad = Calendar.getInstance();
if (null != month) {
cad.setTime(month);
}
int day_month = cad.getActualMaximum(Calendar.DAY_OF_MONTH); // 获取当月天数
for (int i = 0; i < day_month; i++) {
cad.set(Calendar.DAY_OF_MONTH, i + 1);
rs.add(df.format(cad.getTime()));
}
return rs;
}
/**
* 获取month所在月的所有天
*
* @param month 要查询的日期(如果为null 则默认为当前月)
* @return 日期List
*/
public static List<Date> getAllDaysOfMonth(Date month) {
List<Date> rs = new ArrayList<Date>();
Calendar cad = Calendar.getInstance();
if (null != month) {
cad.setTime(month);
}
int day_month = cad.getActualMaximum(Calendar.DAY_OF_MONTH); // 获取当月天数
for (int i = 0; i < day_month; i++) {
cad.set(Calendar.DAY_OF_MONTH, i + 1);
rs.add(cad.getTime());
}
return rs;
}
/**
* 获取指定日期区间所有天
*
* @param begin
* @param end
* @param dateFormat (如果为null 则返回yyyy-MM-dd格式的日期)
* @return
*/
public static List<String> getSpecifyDaysOfMonthInString(Date begin, Date end, DateFormat dateFormat) {
DateFormat df = null;
if (null == dateFormat) {
df = new SimpleDateFormat("yyyy-MM-dd");
}
List<String> rs = new ArrayList<String>();
List<Date> tmplist = getSpecifyDaysOfMonth(begin, end);
for (Date date : tmplist)
rs.add(df.format(date));
return rs;
}
/**
* 获取指定日期区间所有天
*
* @param begin
* @param end
* @return
*/
public static List<Date> getSpecifyDaysOfMonth(Date begin, Date end) {
List<Date> rs = new ArrayList<Date>();
Calendar cad = Calendar.getInstance();
int day_month = -1;
if (null == begin) {// 设置开始日期为指定日期
// day_month = cad.getActualMaximum(Calendar.DAY_OF_MONTH); // 获取当月天数
cad.set(Calendar.DAY_OF_MONTH, 1);// 设置开始日期为当前月的第一天
begin = cad.getTime();
}
cad.setTime(begin);
if (null == end) {// 如果结束日期为空 ,设置结束日期为下月的第一天
day_month = cad.getActualMaximum(Calendar.DAY_OF_MONTH); // 获取当月天数
cad.set(Calendar.DAY_OF_MONTH, day_month + 1);
end = cad.getTime();
}
cad.set(Calendar.DAY_OF_MONTH, 1);// 设置开始日期为当前月的第一天
Date tmp = begin;
int i = 1;
while (true) {
cad.set(Calendar.DAY_OF_MONTH, i);
i++;
tmp = cad.getTime();
if (tmp.before(end)) {
rs.add(cad.getTime());
} else {
break;
}
}
return rs;
}
/**
* 获取当前日期
*
* @return 一个包含年月日的<code>Date</code>型日期
*/
public static synchronized Date getCurrDate() {
Calendar calendar = Calendar.getInstance();
return calendar.getTime();
}
public static String format(Date date, String pattern) {
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
return dateFormat.format(date);
}
/**
* 获取当前完整时间,样式: yyyy-MM-dd hh:mm:ss
*
* @return 一个包含年月日时分秒的<code>String</code>型日期。yyyy-MM-dd hh:mm:ss
*/
public static String getCurrDateTimeStr() {
return format(getCurrDate(), YYYY_MM_DD_HH_MM_SS);
}
/**
* 获得指定日期的前一天
*
* @param specifiedDay YYYY_MM_DD_HH_MM_SS 格式
* @param formatStr 日期类型
* @return
*/
public static String getSpecifiedDayBefore(String specifiedDay, String formatStr) {// 可以用new
// Date().toLocalString()传递参数
Calendar c = Calendar.getInstance();
Date date = null;
try {
date = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS).parse(specifiedDay);
} catch (ParseException e) {
e.printStackTrace();
}
c.setTime(date);
int day = c.get(Calendar.DATE);
c.set(Calendar.DATE, day - 1);
String dayBefore = new SimpleDateFormat(formatStr).format(c.getTime());
return dayBefore;
}
/**
* 获得指定日期的后一天
*
* @param specifiedDay YYYY_MM_DD_HH_MM_SS 格式
* @param formatStr 日期类型
* @return
*/
public static String getSpecifiedDayAfter(String specifiedDay, String formatStr) {
Calendar c = Calendar.getInstance();
Date date = null;
try {
date = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS).parse(specifiedDay);
} catch (ParseException e) {
e.printStackTrace();
}
c.setTime(date);
int day = c.get(Calendar.DATE);
c.set(Calendar.DATE, day + 1);
String dayAfter = new SimpleDateFormat(formatStr).format(c.getTime());
return dayAfter;
}
/**
* 获取本周第一天的日期
*
* @return
*/
public static final String getWeekFirstDay() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
int day_of_week = cal.get(Calendar.DAY_OF_WEEK) - 2;
cal.add(Calendar.DATE, -day_of_week);
return sdf.format(cal.getTime());
}
/**
* 获取当前月的第一天
*
* @return
*/
public static final String getCurrentMonthFirstDay() {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 当前月的第一天
cal.set(GregorianCalendar.DAY_OF_MONTH, 1);
Date beginTime = cal.getTime();
return sdf.format(beginTime);
}
/**
* 获取昨天开始时间
*
* @return
*/
public static final String getYesterdayStart() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(cal.getTime());
}
public static final String getYesterdayEnd() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(cal.getTime()) + " 23:59:59";
}
public static final String getCurrDayStart() {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(cal.getTime());
}
/**
* 功能:获取指定月份的第一天<br/>
*/
public static final String getStartDayWithMonth(String month) throws ParseException {
Calendar calendar = new GregorianCalendar();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat mf = new SimpleDateFormat("yyyy-MM");
Date date = mf.parse(month);
calendar.setTime(date);
calendar.add(Calendar.DATE, 0);// 因为格式化时默认了DATE为本月第一天所以此处为0
return sdf.format(calendar.getTime());
}
/**
* 功能:获取指定月份的最后一天<br/>
*/
public static final String getEndDayWithMonth(String month) throws ParseException {
Calendar calendar = new GregorianCalendar();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat mf = new SimpleDateFormat("yyyy-MM");
Date date = mf.parse(month);
calendar.setTime(date);
calendar.roll(Calendar.DATE, -1);// api解释roll():向指定日历字段添加指定(有符号的)时间量,不更改更大的字段
return sdf.format(calendar.getTime());
}
public static final String formatYearMonthDay(String dateStr) throws ParseException {
if (StringUtils.isNotBlank(dateStr)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(dateStr);
return sdf.format(date);
} else {
return "";
}
}
/**
* 功能:<br/>
* 根据时间 yyyy-MM-dd 获取该日期是本月第几周
*/
public static final int getWeekIndexOfMonth(String dateStr) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(dateStr);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int weekOfMonth = calendar.get(Calendar.WEEK_OF_MONTH);
return weekOfMonth;
}
/**
* 获取当前时间到指定时间距离多少秒 功能:<br/>
*/
public static final int getSecondToDesignationTime(String designationTime) {
// 24小时制
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date toDate;
try {
toDate = dateFormat.parse(designationTime);
int u = (int) ((toDate.getTime() - dateFormat.parse(DateUtil.getCurrDateTimeStr()).getTime()) / 1000);
return u;
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
public static final int getYear() {
Calendar cal = Calendar.getInstance();
return cal.get(cal.YEAR);
}
public static final int getMonth() {
Calendar cal = Calendar.getInstance();
return cal.get(cal.MONTH) + 1;
}
public static final int getDay() {
Calendar cal = Calendar.getInstance();
return cal.get(cal.DATE);
}
/**
* 通过时间秒毫秒数判断两个时间的间隔
*
* @param start
* @param end
* @return
*/
public static int differentDaysByMillisecond(LocalDateTime start, LocalDateTime end) {
// ZoneOffset.of("+8") 是指定为东8区
return (int) ((end.toInstant(ZoneOffset.of("+8")).toEpochMilli() - start.toInstant(ZoneOffset.of("+8")).toEpochMilli()) / (1000 * 3600 * 24));
}
}
4.EncryptUtil
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Base64;
public class EncryptUtil {
private static final Logger logger = LoggerFactory.getLogger(EncryptUtil.class);
public static String encodeBase64(byte[] bytes){
String encoded = Base64.getEncoder().encodeToString(bytes);
return encoded;
}
public static byte[] decodeBase64(String str){
byte[] bytes = null;
bytes = Base64.getDecoder().decode(str);
return bytes;
}
public static String encodeUTF8StringBase64(String str){
String encoded = null;
try {
encoded = Base64.getEncoder().encodeToString(str.getBytes("utf-8"));
} catch (UnsupportedEncodingException e) {
logger.warn("不支持的编码格式",e);
}
return encoded;
}
public static String decodeUTF8StringBase64(String str){
String decoded = null;
byte[] bytes = Base64.getDecoder().decode(str);
try {
decoded = new String(bytes,"utf-8");
}catch(UnsupportedEncodingException e){
logger.warn("不支持的编码格式",e);
}
return decoded;
}
public static String encodeURL(String url) {
String encoded = null;
try {
encoded = URLEncoder.encode(url, "utf-8");
} catch (UnsupportedEncodingException e) {
logger.warn("URLEncode失败", e);
}
return encoded;
}
public static String decodeURL(String url) {
String decoded = null;
try {
decoded = URLDecoder.decode(url, "utf-8");
} catch (UnsupportedEncodingException e) {
logger.warn("URLDecode失败", e);
}
return decoded;
}
public static void main(String [] args){
String str = "abcd{'a':'b'}";
String encoded = EncryptUtil.encodeUTF8StringBase64(str);
String decoded = EncryptUtil.decodeUTF8StringBase64(encoded);
System.out.println(str);
System.out.println(encoded);
System.out.println(decoded);
String url = "== wo";
String urlEncoded = EncryptUtil.encodeURL(url);
String urlDecoded = EncryptUtil.decodeURL(urlEncoded);
System.out.println(url);
System.out.println(urlEncoded);
System.out.println(urlDecoded);
}
}
5.FileUtil
import java.io.*;
/**
* 文件读取工具类
*/
public class FileUtil {
/**
* 读取文件内容,作为字符串返回
*/
public static String readFileAsString(String filePath) throws IOException {
File file = new File(filePath);
if (!file.exists()) {
throw new FileNotFoundException(filePath);
}
if (file.length() > 1024 * 1024 * 1024) {
throw new IOException("File is too large");
}
StringBuilder sb = new StringBuilder((int) (file.length()));
// 创建字节输入流
FileInputStream fis = new FileInputStream(filePath);
// 创建一个长度为10240的Buffer
byte[] bbuf = new byte[10240];
// 用于保存实际读取的字节数
int hasRead = 0;
while ( (hasRead = fis.read(bbuf)) > 0 ) {
sb.append(new String(bbuf, 0, hasRead));
}
fis.close();
return sb.toString();
}
/**
* 根据文件路径读取byte[] 数组
*/
public static byte[] readFileByBytes(String filePath) throws IOException {
File file = new File(filePath);
if (!file.exists()) {
throw new FileNotFoundException(filePath);
} else {
ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
BufferedInputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream(file));
short bufSize = 1024;
byte[] buffer = new byte[bufSize];
int len1;
while (-1 != (len1 = in.read(buffer, 0, bufSize))) {
bos.write(buffer, 0, len1);
}
byte[] var7 = bos.toByteArray();
return var7;
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException var14) {
var14.printStackTrace();
}
bos.close();
}
}
}
}
6.HttpUtil
import com.alibaba.fastjson.JSON;
import com.xuecheng.base.model.RestResponse;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
/**
* http 工具类
*/
public class HttpUtil {
public static void writerError(RestResponse restResponse, HttpServletResponse response) throws IOException {
response.setContentType("application/json,charset=utf-8");
response.setStatus(Integer.valueOf(restResponse.getCode()));
JSON.writeJSONString(response.getOutputStream(), restResponse);
}
public static String getAccessToken(String ak,String sk) throws Exception {
// 获取token地址
String authHost = "https://aip.baidubce.com/oauth/2.0/token?";
String getAccessTokenUrl = authHost
// 1. grant_type为固定参数
+ "grant_type=client_credentials"
// 2. 官网获取的 API Key
+ "&client_id=" + ak
// 3. 官网获取的 Secret Key
+ "&client_secret=" + sk;
URL realUrl = new URL(getAccessTokenUrl);
// 打开和URL之间的连接
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("GET");
connection.connect();
// 获取所有响应头字段
/*Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.err.println(key + "--->" + map.get(key));
}*/
// 定义 BufferedReader输入流来读取URL的响应
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String result = "";
String line;
while ((line = in.readLine()) != null) {
result += line;
}
in.close();
connection.disconnect();
/**
* 返回结果
*/
Map<String,Object> resultMap= JsonUtil.jsonToMap(result);
return resultMap.get("access_token").toString();
}
public static String post(String requestUrl, String accessToken, String params)
throws Exception {
String contentType = "application/x-www-form-urlencoded";
return HttpUtil.post(requestUrl, accessToken, contentType, params);
}
public static String post(String requestUrl, String accessToken, String contentType, String params)
throws Exception {
String encoding = "UTF-8";
if (requestUrl.contains("nlp")) {
encoding = "GBK";
}
return HttpUtil.post(requestUrl, accessToken, contentType, params, encoding);
}
public static String post(String requestUrl, String accessToken, String contentType, String params, String encoding)
throws Exception {
String url = requestUrl + "?access_token=" + accessToken;
return HttpUtil.postGeneralUrl(url, contentType, params, encoding);
}
public static String postGeneralUrl(String generalUrl, String contentType, String params, String encoding)
throws Exception {
URL url = new URL(generalUrl);
// 打开和URL之间的连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
// 设置通用的请求属性
connection.setRequestProperty("Content-Type", contentType);
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setUseCaches(false);
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setConnectTimeout(20000);
connection.setReadTimeout(20000);
// 得到请求的输出流对象
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.write(params.getBytes(encoding));
out.flush();
out.close();
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> headers = connection.getHeaderFields();
// 遍历所有的响应头字段
/*for (String key : headers.keySet()) {
System.err.println(key + "--->" + headers.get(key));
}*/
// 定义 BufferedReader输入流来读取URL的响应
BufferedReader in = null;
in = new BufferedReader(
new InputStreamReader(connection.getInputStream(), encoding));
String result = "";
String getLine;
while ((getLine = in.readLine()) != null) {
result += getLine;
}
in.close();
connection.disconnect();
//System.err.println("result:" + result);
return result;
}
}
7.IDCardUtil
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
/**
* <P>
* 身份证号工具类
* </p>
*
*/
public class IDCardUtil {
/**
* 通过身份证号码获取出生日期、性别、年龄
* @param idNumber
* @return 返回的出生日期格式:1990-01-01 性别格式:F-女,M-男
*/
public static Map<String, String> getInfo(String idNumber) {
String birthday = "";
String age = "";
String gender = "";
int year = Calendar.getInstance().get(Calendar.YEAR);
char[] number = idNumber.toCharArray();
if (idNumber.length() == 15) {
birthday = "19" + idNumber.substring(6, 8) + "-" + idNumber.substring(8, 10) + "-" + idNumber
.substring(10, 12);
gender =
Integer.parseInt(idNumber.substring(idNumber.length() - 3, idNumber.length())) % 2 == 0 ? "F" : "M";
age = (year - Integer.parseInt("19" + idNumber.substring(6, 8))) + "";
} else if (idNumber.length() == 18) {
birthday = idNumber.substring(6, 10) + "-" + idNumber.substring(10, 12) + "-" + idNumber.substring(12, 14);
gender = Integer.parseInt(idNumber.substring(idNumber.length() - 4, idNumber.length() - 1)) % 2 == 0 ?
"女" :
"男";
age = (year - Integer.parseInt(idNumber.substring(6, 10))) + "";
}
Map<String, String> map = new HashMap();
map.put("birthday", birthday);
map.put("age", age);
map.put("gender", gender);
return map;
}
public static void main(String[] args) {
System.out.println(getInfo("658182198109222913"));
}
}
8.IdWorkerUtils
import java.util.Random;
/**
* snow flow .
*
*/
public final class IdWorkerUtils {
private static final Random RANDOM = new Random();
private static final long WORKER_ID_BITS = 5L;
private static final long DATACENTERIDBITS = 5L;
private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);
private static final long MAX_DATACENTER_ID = ~(-1L << DATACENTERIDBITS);
private static final long SEQUENCE_BITS = 12L;
private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;
private static final long DATACENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;
private static final long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATACENTERIDBITS;
private static final long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS);
private static final IdWorkerUtils ID_WORKER_UTILS = new IdWorkerUtils();
private long workerId;
private long datacenterId;
private long idepoch;
private long sequence = '0';
private long lastTimestamp = -1L;
private IdWorkerUtils() {
this(RANDOM.nextInt((int) MAX_WORKER_ID), RANDOM.nextInt((int) MAX_DATACENTER_ID), 1288834974657L);
}
private IdWorkerUtils(final long workerId, final long datacenterId, final long idepoch) {
if (workerId > MAX_WORKER_ID || workerId < 0) {
throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", MAX_WORKER_ID));
}
if (datacenterId > MAX_DATACENTER_ID || datacenterId < 0) {
throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", MAX_DATACENTER_ID));
}
this.workerId = workerId;
this.datacenterId = datacenterId;
this.idepoch = idepoch;
}
/**
* Gets instance.
*
* @return the instance
*/
public static IdWorkerUtils getInstance() {
return ID_WORKER_UTILS;
}
public synchronized long nextId() {
long timestamp = timeGen();
if (timestamp < lastTimestamp) {
throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
}
if (lastTimestamp == timestamp) {
sequence = (sequence + 1) & SEQUENCE_MASK;
if (sequence == 0) {
timestamp = tilNextMillis(lastTimestamp);
}
} else {
sequence = 0L;
}
lastTimestamp = timestamp;
return ((timestamp - idepoch) << TIMESTAMP_LEFT_SHIFT)
| (datacenterId << DATACENTER_ID_SHIFT)
| (workerId << WORKER_ID_SHIFT) | sequence;
}
private long tilNextMillis(final long lastTimestamp) {
long timestamp = timeGen();
while (timestamp <= lastTimestamp) {
timestamp = timeGen();
}
return timestamp;
}
private long timeGen() {
return System.currentTimeMillis();
}
/**
* Build part number string.
*
* @return the string
*/
public String buildPartNumber() {
return String.valueOf(ID_WORKER_UTILS.nextId());
}
/**
* Create uuid string.
*
* @return the string
*/
public String createUUID() {
return String.valueOf(ID_WORKER_UTILS.nextId());
}
public static void main(String[] args) {
System.out.println(IdWorkerUtils.getInstance().nextId());
}
}
9.IPUtil
import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class IPUtil {
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
// 多次反向代理后会有多个ip值,第一个ip才是真实ip
if( ip.indexOf(",")!=-1 ){
ip = ip.split(",")[0];
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("X-Real-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
if (ip.equals("127.0.0.1") || ip.endsWith("0:0:0:0:0:0:1")) {
// 根据网卡取本机配置的IP
InetAddress inet = null;
try {
inet = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
ip = inet.getHostAddress();
}
}
return ip;
}
}
10.JsonUtil
/**
* @(#)JsonUtil.java 2014-2-23 下午5:44:19
*/
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JsonUtil {
public static String objectTojson(Object object){
return JSON.toJSONString(object,SerializerFeature.WriteDateUseDateFormat);
}
public static String listTojson(List list){
return JSON.toJSONString(list, SerializerFeature.WriteDateUseDateFormat);
}
/**
* 字符串Json格式转换为对象Map
* @param strJson {"username":"sxb"}
* @return 根据json转换为Map对象
*/
public static Map<String, Object> jsonToMap(String strJson){
Map<String, Object> jsoMap = new HashMap<String, Object>();
try {
jsoMap = JSONObject.parseObject(strJson,Map.class);
} catch (JSONException e) {
System.out.println("json转换Map出错:"+e.getMessage());
}
return jsoMap;
}
public static <T> T jsonToObject(String strJson, Class<T> tClass){
try {
return JSON.parseObject(strJson, tClass);
} catch (JSONException e) {
System.out.println("json转换Map出错:"+e.getMessage());
}
return null;
}
/**
* 字符串Json 转换为对象List
* @param strJson [{"username":"sxb"}]
* @return 根据json转换List
*/
public static <T> List<T> jsonToList(String strJson, Class<T> tClass){
try {
return JSONObject.parseArray(strJson, tClass);
} catch (JSONException e) {
System.out.println("json转换List出错:"+e.getMessage());
}
return null;
}
}
11.MD5Util
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
/**
* 获取字符串的MD5摘要计算结果
* @param plainText
* @return
*/
public static String getMd5(String plainText) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
//32位加密
return buf.toString();
// 16位的加密
//return buf.toString().substring(8, 24);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
}
12.Mp4VideoUtil
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Mp4VideoUtil extends VideoUtil {
String ffmpeg_path = "D:\\Program Files\\ffmpeg-20180227-fa0c9d6-win64-static\\bin\\ffmpeg.exe";//ffmpeg的安装位置
String video_path = "D:\\BaiduNetdiskDownload\\test1.avi";
String mp4_name = "test1.mp4";
String mp4folder_path = "D:/BaiduNetdiskDownload/Movies/test1/";
public Mp4VideoUtil(String ffmpeg_path, String video_path, String mp4_name, String mp4folder_path){
super(ffmpeg_path);
this.ffmpeg_path = ffmpeg_path;
this.video_path = video_path;
this.mp4_name = mp4_name;
this.mp4folder_path = mp4folder_path;
}
//清除已生成的mp4
private void clear_mp4(String mp4_path){
//删除原来已经生成的m3u8及ts文件
File mp4File = new File(mp4_path);
if(mp4File.exists() && mp4File.isFile()){
mp4File.delete();
}
}
/**
* 视频编码,生成mp4文件
* @return 成功返回success,失败返回控制台日志
*/
public String generateMp4(){
//清除已生成的mp4
// clear_mp4(mp4folder_path+mp4_name);
clear_mp4(mp4folder_path);
/*
ffmpeg.exe -i lucene.avi -c:v libx264 -s 1280x720 -pix_fmt yuv420p -b:a 63k -b:v 753k -r 18 .\lucene.mp4
*/
List<String> commend = new ArrayList<String>();
//commend.add("D:\\Program Files\\ffmpeg-20180227-fa0c9d6-win64-static\\bin\\ffmpeg.exe");
commend.add(ffmpeg_path);
commend.add("-i");
// commend.add("D:\\BaiduNetdiskDownload\\test1.avi");
commend.add(video_path);
commend.add("-c:v");
commend.add("libx264");
commend.add("-y");//覆盖输出文件
commend.add("-s");
commend.add("1280x720");
commend.add("-pix_fmt");
commend.add("yuv420p");
commend.add("-b:a");
commend.add("63k");
commend.add("-b:v");
commend.add("753k");
commend.add("-r");
commend.add("18");
// commend.add(mp4folder_path + mp4_name );
commend.add(mp4folder_path );
String outstring = null;
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
//将标准输入流和错误输入流合并,通过标准输入流程读取信息
builder.redirectErrorStream(true);
Process p = builder.start();
outstring = waitFor(p);
} catch (Exception ex) {
ex.printStackTrace();
}
// Boolean check_video_time = this.check_video_time(video_path, mp4folder_path + mp4_name);
Boolean check_video_time = this.check_video_time(video_path, mp4folder_path);
if(!check_video_time){
return outstring;
}else{
return "success";
}
}
public static void main(String[] args) throws IOException {
// ProcessBuilder builder = new ProcessBuilder();
// builder.command("D:\\Program Files\\EditPlus\\EditPlus.exe");
// //将标准输入流和错误输入流合并,通过标准输入流程读取信息
// builder.redirectErrorStream(true);
// Process p = builder.start();
//ffmpeg的路径
String ffmpeg_path = "D:\\soft\\ffmpeg\\ffmpeg.exe";//ffmpeg的安装位置
//源avi视频的路径
String video_path = "D:\\develop\\upload\\02-概述-分库分表是什么.avi";
//转换后mp4文件的名称
String mp4_name = "02-概述-分库分表是什么.mp4";
//转换后mp4文件的路径
String mp4_path = "D:\\develop\\upload\\02-概述-分库分表是什么.mp4";
//创建工具类对象
Mp4VideoUtil videoUtil = new Mp4VideoUtil(ffmpeg_path,video_path,mp4_name,mp4_path);
//开始视频转换,成功将返回success
String s = videoUtil.generateMp4();
System.out.println(s);
}
}
13.PasswordUtil
import org.apache.commons.codec.binary.Hex;
import java.security.MessageDigest;
import java.util.Random;
/**
* <P>
* MD5加盐加密
* </p>
*
*/
public class PasswordUtil {
/**
* 生成含有随机盐的密码
*/
public static String generate(String password) {
Random r = new Random();
StringBuilder sb = new StringBuilder(16);
sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));
int len = sb.length();
if (len < 16) {
for (int i = 0; i < 16 - len; i++) {
sb.append("0");
}
}
String salt = sb.toString();
password = md5Hex(password + salt);
char[] cs = new char[48];
for (int i = 0; i < 48; i += 3) {
cs[i] = password.charAt(i / 3 * 2);
char c = salt.charAt(i / 3);
cs[i + 1] = c;
cs[i + 2] = password.charAt(i / 3 * 2 + 1);
}
return new String(cs);
}
/**
* 校验密码是否正确
*/
public static boolean verify(String password, String md5) {
char[] cs1 = new char[32];
char[] cs2 = new char[16];
for (int i = 0; i < 48; i += 3) {
cs1[i / 3 * 2] = md5.charAt(i);
cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);
cs2[i / 3] = md5.charAt(i + 1);
}
String salt = new String(cs2);
return md5Hex(password + salt).equals(new String(cs1));
}
/**
* 获取十六进制字符串形式的MD5摘要
*/
public static String md5Hex(String src) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bs = md5.digest(src.getBytes());
return new String(new Hex().encode(bs));
} catch (Exception e) {
return null;
}
}
}
14.PaymentUtil
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.regex.Pattern;
public class PaymentUtil {
private static final Pattern pattern = Pattern.compile("SJPAY(,\\S+){4}");
public static final String SHANJUPAY_PREFIX = "XC";
public static boolean checkPayOrderAttach (String attach) {
if (StringUtils.isBlank(attach)) {
return false;
}
return pattern.matcher(attach).matches();
}
public static String genUniquePayOrderNo() {
String dateTime = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS").format(LocalDateTime.now());
return SHANJUPAY_PREFIX + dateTime + RandomStringUtils.randomAlphanumeric(15);
}
public static void main(String[] args) {
System.out.println(genUniquePayOrderNo());
System.out.println(genUniquePayOrderNo().length());
}
}
15.PhoneUtil
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PhoneUtil {
/**
* 校验用户手机号是否合法
* @param phone
* @return
*/
public static Boolean isMatches(String phone){
String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(phone);
return m.matches();
}
//public static void main(String[] args) {
// System.out.println(isMatches("13512341233"));
//}
}
16.QRCodeUtil
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.apache.commons.lang3.StringUtils;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
/**
* @description 二维码生成工具
* @author Mr.M
* @date 2022/10/3 0:03
* @version 1.0
*/
public class QRCodeUtil {
/**
* 生成二维码
*
* @param content 二维码对应的URL
* @param width 二维码图片宽度
* @param height 二维码图片高度
* @return
*/
public String createQRCode(String content, int width, int height) throws IOException {
String resultImage = "";
//除了尺寸,传入内容不能为空
if (!StringUtils.isEmpty(content)) {
ServletOutputStream stream = null;
ByteArrayOutputStream os = new ByteArrayOutputStream();
//二维码参数
@SuppressWarnings("rawtypes")
HashMap<EncodeHintType, Comparable> hints = new HashMap<>();
//指定字符编码为“utf-8”
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
//L M Q H四个纠错等级从低到高,指定二维码的纠错等级为M
//纠错级别越高,可以修正的错误就越多,需要的纠错码的数量也变多,相应的二维吗可储存的数据就会减少
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
//设置图片的边距
hints.put(EncodeHintType.MARGIN, 1);
try {
//zxing生成二维码核心类
QRCodeWriter writer = new QRCodeWriter();
//把输入文本按照指定规则转成二维吗
BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
//生成二维码图片流
BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
//输出流
ImageIO.write(bufferedImage, "png", os);
/**
* 原生转码前面没有 data:image/png;base64 这些字段,返回给前端是无法被解析,所以加上前缀
*/
resultImage = new String("data:image/png;base64," + EncryptUtil.encodeBase64(os.toByteArray()));
return resultImage;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("生成二维码出错");
} finally {
if (stream != null) {
stream.flush();
stream.close();
}
}
}
return null;
}
public static void main(String[] args) throws IOException {
QRCodeUtil qrCodeUtil = new QRCodeUtil();
System.out.println(qrCodeUtil.createQRCode("http://192.168.101.1:63030/orders/alipaytest", 200, 200));
}
}
17.RandomStringUtil
import java.util.Random;
/**
* 随机字符串工具
*
*
*/
public class RandomStringUtil {
/**
* 获取指定长度随机字符串
*
* @param length
* @return
*/
public static String getRandomString(int length) {
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(3);
long result = 0;
switch (number) {
case 0:
result = Math.round(Math.random() * 25 + 65);
sb.append(String.valueOf((char) result));
break;
case 1:
result = Math.round(Math.random() * 25 + 97);
sb.append(String.valueOf((char) result));
break;
case 2:
sb.append(String.valueOf(new Random().nextInt(10)));
break;
}
}
return sb.toString();
}
/**
* 测试验证
*
* @param args
*/
//public static void main(String[] args) {
// System.out.println(RandomStringUtil.getRandomString(5));
// String str2 = RandomStringUtils.random(12,"123456789");
// System.out.println(str2);
//}
}
18.RSAUtil
import javax.crypto.Cipher;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class RSAUtil {
public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
final static Base64.Decoder decoder = Base64.getDecoder();
final static Base64.Encoder encoder = Base64.getEncoder();
/**
* RSA签名
* @param content 待签名数据
* @param privateKey 商户私钥
* @param input_charset 编码格式
* @return 签名值
*/
public static String sign(String content, String privateKey, String input_charset) {
try {
PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(decoder.decode(privateKey));
KeyFactory keyf = KeyFactory.getInstance("RSA");
PrivateKey priKey = keyf.generatePrivate(priPKCS8);
Signature signature = Signature.getInstance(SIGN_ALGORITHMS);
signature.initSign(priKey);
signature.update(content.getBytes(input_charset));
byte[] signed = signature.sign();
return encoder.encodeToString(signed);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* RSA验签名检查
* @param content 待签名数据
* @param sign 签名值
* @param public_key 公钥
* @param input_charset 编码格式
* @return 布尔值
*/
public static boolean verify(String content, String sign, String public_key, String input_charset) {
try {
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] encodedKey = decoder.decode(public_key);
PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
Signature signature = Signature.getInstance(SIGN_ALGORITHMS);
signature.initVerify(pubKey);
signature.update(content.getBytes(input_charset));
boolean bverify = signature.verify(decoder.decode(sign));
return bverify;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 解密
* @param content 密文
* @param private_key 商户私钥
* @param input_charset 编码格式
* @return 解密后的字符串
*/
public static String decrypt(String content, String private_key, String input_charset) throws Exception {
PrivateKey prikey = getPrivateKey(private_key);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, prikey);
InputStream ins = new ByteArrayInputStream(decoder.decode(content));
ByteArrayOutputStream writer = new ByteArrayOutputStream();
//rsa解密的字节大小最多是128,将需要解密的内容,按128位拆开解密
byte[] buf = new byte[128];
int bufl;
while ((bufl = ins.read(buf)) != -1) {
byte[] block = null;
if (buf.length == bufl) {
block = buf;
} else {
block = new byte[bufl];
for (int i = 0; i < bufl; i++) {
block[i] = buf[i];
}
}
writer.write(cipher.doFinal(block));
}
return new String(writer.toByteArray(), input_charset);
}
/**
* 得到私钥
* @param key 密钥字符串(经过base64编码)
* @throws Exception
*/
public static PrivateKey getPrivateKey(String key) throws Exception {
byte[] keyBytes;
keyBytes = decoder.decode(key);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateKey;
}
//生成密钥对
public static KeyPair getKeyPair() throws Exception {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(512); //可以理解为:加密后的密文长度,实际原文要小些 越大 加密解密越慢
KeyPair keyPair = keyGen.generateKeyPair();
return keyPair;
}
public static final String depository_publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJKcP4TjCb9+OKf0uvHkDO6njI8b9KKlu3ZdCkom4SONf8KkZ1jVl6A7XWnJ33gBLnbTGVUm5I+XvFEG5bSWVbkCAwEAAQ==";
public static final String depository_privateKey = "MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAkpw/hOMJv344p/S68eQM7qeMjxv0oqW7dl0KSibhI41/wqRnWNWXoDtdacnfeAEudtMZVSbkj5e8UQbltJZVuQIDAQABAkBrkkVw5X0DikNbyM9aKG/ss/cIEgT/SgcwI7gnDDvo7wntxxPuVZ7P+gkhFqb1ByCLdH/GlsXEZW88HCA9M2ZhAiEA65BsW0uGPhnVRS7hJhLZpuuugKVNyJBBO6jGATe0g/UCIQCfVEZ0bvYd5pA165XwXs7ZFGU99rG410EEh7JRxzx0NQIgdNL9ShGck/PP1y22r2Et3CCKPHa+qrcQAvxipnvv5HkCIBITUoblC8DqplOnrXP+nYLdIHs+IH1y1ip4Zo+GheI9AiBdsG0ql4Unbt1ctYm6XdmqE5rdFD+iDFQRS1FFmUVNUQ==";
public static final String p2p_publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKZKjaBEvudPDolCyuVCBLmfVsSFBu3wfdldLxItRcjSYMzHNoIuYcvHhnMmMi1iXRLeYdbwvI3JQoBHDGN5ad0CAwEAAQ==";
public static final String p2p_privateKey = "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEApkqNoES+508OiULK5UIEuZ9WxIUG7fB92V0vEi1FyNJgzMc2gi5hy8eGcyYyLWJdEt5h1vC8jclCgEcMY3lp3QIDAQABAkAUhQia6UDBXEEH8QUGazIYEbBsSZoETHPLGbOQQ6Pj1tb6CVC57kioBjwtNBnY2jBDWi5K815LnOBcJSSjJPwhAiEA2eO6VZMTkdjQAkpB5dhy/0C3i8zs0c0M1rPoTA/RpkUCIQDDYHJPqHLkQyd//7sEeYcm8cMBTvDKBXyiuGk8eLRauQIgQo6IlalGmg+Dgp+SP5Z9kjD/oCmp0XB0UoVEGS/f140CIQCsG9YXHgi31ACD3T9eHcBVKjvidyveix7UKSdrQdl+4QIgNCtRVLV+783e7PX5hRXD+knsWTQxDEMEsHi1KsAWtPk=";
public static void main(String[] args) throws Exception {
//生成公私钥对
/* KeyPair keyPair = RSAUtil.getKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
System.out.println("-----------------publicKey--------------------- ");
System.out.println(Base64.encode(publicKey.getEncoded()));
System.out.println("-----------------privateKey--------------------- ");
System.out.println(Base64.encode(privateKey.getEncoded()));*/
String content = "加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890加密原文1234567890";
System.out.println("-----------------p2p向存管发送数据--------------------- ");
String signature = RSAUtil.sign(content, p2p_privateKey, "utf-8");
System.out.println("生成签名,原文为:" + content);
if (RSAUtil.verify(content, signature, p2p_publicKey, "utf-8")) {
System.out.println("验证签名成功:" + signature);
} else {
System.out.println("验证签名失败!");
}
System.out.println("-----------------存管向p2p返回数据--------------------- ");
String signature1 = RSAUtil.sign(content, depository_privateKey, "utf-8");
System.out.println("生成签名,原文为:" + content);
if (RSAUtil.verify(content, signature1, depository_publicKey, "utf-8")) {
System.out.println("验证签名成功:" + signature1);
} else {
System.out.println("验证签名失败!");
}
}
}
19.StringUtil
import java.io.File;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StringUtil {
/** yyyy-MM-dd日期格式 */
public static final SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
public static final String SPACE = " ";
public static final String DOT = ".";
public static final String SLASH = "/";
public static final String BACKSLASH = "\\";
public static final String EMPTY = "";
public static final String CRLF = "\r\n";
public static final String NEWLINE = "\n";
public static final String UNDERLINE = "_";
public static final String COMMA = ",";
public static final String HTML_NBSP = " ";
public static final String HTML_AMP = "&";
public static final String HTML_QUOTE = """;
public static final String HTML_LT = "<";
public static final String HTML_GT = ">";
public static final String EMPTY_JSON = "{}";
/**
* 字符串是否为空白 空白的定义如下: <br>
* 1、为null <br>
* 2、为不可见字符(如空格)<br>
* 3、""<br>
*
* @param str
* 被检测的字符串
* @return 是否为空
*/
public static boolean isBlank(String str) {
return str == null || str.trim().length() == 0;
}
/**
* 字符串是否为非空白 空白的定义如下: <br>
* 1、不为null <br>
* 2、不为不可见字符(如空格)<br>
* 3、不为""<br>
*
* @param str 被检测的字符串
*
* @return 是否为非空
*/
public static boolean isNotBlank(String str) {
return false == isBlank(str);
}
/**
* 字符串是否为空,空的定义如下 1、为null <br>
* 2、为""<br>
*
* @param str
* 被检测的字符串
* @return 是否为空
*/
public static boolean isEmpty(String str) {
return str == null || str.length() == 0;
}
/**
* 字符串是否为非空白 空白的定义如下: <br>
* 1、不为null <br>
* 2、不为""<br>
*
* @param str
* 被检测的字符串
* @return 是否为非空
*/
public static boolean isNotEmpty(String str) {
return false == isEmpty(str);
}
/**
* 指定字符串是否被包装
*
* @param str
* 字符串
* @param prefix
* 前缀
* @param suffix
* 后缀
* @return 是否被包装
*/
public static boolean isWrap(String str, String prefix, String suffix) {
return str.startsWith(prefix) && str.endsWith(suffix);
}
/**
* 指定字符串是否被同一字符包装(前后都有这些字符串)
*
* @param str
* 字符串
* @param wrapper
* 包装字符串
* @return 是否被包装
*/
public static boolean isWrap(String str, String wrapper) {
return isWrap(str, wrapper, wrapper);
}
/**
* 指定字符串是否被同一字符包装(前后都有这些字符串)
*
* @param str
* 字符串
* @param wrapper
* 包装字符
* @return 是否被包装
*/
public static boolean isWrap(String str, char wrapper) {
return isWrap(str, wrapper, wrapper);
}
/**
* 指定字符串是否被包装
*
* @param str
* 字符串
* @param prefixChar
* 前缀
* @param suffixChar
* 后缀
* @return 是否被包装
*/
public static boolean isWrap(String str, char prefixChar, char suffixChar) {
return str.charAt(0) == prefixChar && str.charAt(str.length() - 1) == suffixChar;
}
/**
* 补充字符串以满足最小长度 StrUtil.padPre("1", 3, '0');//"001"
*
* @param str
* 字符串
* @param minLength
* 最小长度
* @param padChar
* 补充的字符
* @return 补充后的字符串
*/
public static String padPre(String str, int minLength, char padChar) {
if (str.length() >= minLength) {
return str;
}
StringBuilder sb = new StringBuilder(minLength);
for (int i = str.length(); i < minLength; i++) {
sb.append(padChar);
}
sb.append(str);
return sb.toString();
}
/**
* 补充字符串以满足最小长度 StrUtil.padEnd("1", 3, '0');//"100"
*
* @param str
* 字符串
* @param minLength
* 最小长度
* @param padChar
* 补充的字符
* @return 补充后的字符串
*/
public static String padEnd(String str, int minLength, char padChar) {
if (str.length() >= minLength) {
return str;
}
StringBuilder sb = new StringBuilder(minLength);
sb.append(str);
for (int i = str.length(); i < minLength; i++) {
sb.append(padChar);
}
return sb.toString();
}
/**
* 创建StringBuilder对象
*
* @return StringBuilder对象
*/
public static StringBuilder builder() {
return new StringBuilder();
}
/**
* 创建StringBuilder对象
*
* @return StringBuilder对象
*/
public static StringBuilder builder(int capacity) {
return new StringBuilder(capacity);
}
/**
* 创建StringBuilder对象
*
* @return StringBuilder对象
*/
public static StringBuilder builder(String... strs) {
final StringBuilder sb = new StringBuilder();
for (String str : strs) {
sb.append(str);
}
return sb;
}
/**
* 获得字符串对应字符集的byte数组
*
* @param str
* 字符串
* @param charset
* 字符集编码
* @return byte数组
*/
public static byte[] bytes(String str, String charset) {
if (null == str) {
return null;
}
if (isBlank(charset)) {
return null;
}
return str.getBytes(Charset.forName(charset));
}
/***
* 判断 String 是否int
*
* @param input
* @return
*/
public static boolean isInteger(String input) {
Matcher mer = Pattern.compile("^[+-]?[0-9]+$").matcher(input);
return mer.find();
}
/**
* 数字型String字符串转换成int型数组
*
* @param str
* string类型的数组
* @return
*/
public static Integer[] stringToIntegerArray(String[] str) {
Integer array[] = new Integer[str.length];
for (int i = 0; i < str.length; i++) {
array[i] = Integer.parseInt(str[i]);
}
return array;
}
/**
* 数字型String字符串转换成Long型数组
*
* @param str
* string类型的数组
* @return
*/
public static Long[] stringTOLongArray(String[] str) {
Long array[] = new Long[str.length];
for (int i = 0; i < str.length; i++) {
array[i] = Long.parseLong(str[i]);
}
return array;
}
/**
* 获取文件后缀
*
* @param src
* 文件路径/名称 文件路径 C:\Users\Public\Pictures\Sample Pictures\test.jpg
* @return 如果文件后缀 jpg
*/
public static String getFileExt(String src) {
String filename = src.substring(src.lastIndexOf(File.separator) + 1, src.length());// 获取到文件名
return filename.substring(filename.lastIndexOf(".") + 1);
}
/**
* 获取文件名称,不带文件后缀部分
*
* @param src
* 文件路径 C:\Users\Public\Pictures\Sample Pictures\test.jpg
* @return 文件名称 不带文件后缀 test
*/
public static String getFileName(String src) {
String filename = src.substring(src.lastIndexOf(File.separator) + 1, src.length());// 获取到文件名
return filename.substring(0, filename.lastIndexOf("."));
}
/**
* 判断字符串是否为空(不能为空字符串)
*
* @param src
* @return
*/
public static boolean isNull(String src) {
return src == null || src.length() == 0 || src.trim().length() == 0;
}
/**
* 检查数组中,是否含有当前元素
*
* @param arr
* @param checkValue
* @return
*/
public static Boolean checkArrayValue(String[] arr, String checkValue) {
Boolean checkFlag = false;
if (arr != null && arr.length > 0) {
for (int i = 0; i < arr.length; i++) {
if (arr[i].equals(checkValue)) {
checkFlag = true;
break;
}
}
}
return checkFlag;
}
/**
* 检查数组中元素,是否在checkValue中出现
*
* @param arr
* @param checkValue
* @return
*/
public static Boolean isContains(String[] arr, String checkValue) {
Boolean checkFlag = false;
if (arr != null && arr.length > 0) {
for (String str : arr) {
if (checkValue.indexOf(str)!=-1) {
checkFlag = true;
break;
}
}
}
return checkFlag;
}
}
20.VideoUtil
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* 此文件作为视频文件处理父类,提供:
* 1、查看视频时长
* 2、校验两个视频的时长是否相等
*
*/
public class VideoUtil {
String ffmpeg_path = "D:\\Program Files\\ffmpeg-20180227-fa0c9d6-win64-static\\bin\\ffmpeg.exe";//ffmpeg的安装位置
public VideoUtil(String ffmpeg_path){
this.ffmpeg_path = ffmpeg_path;
}
//检查视频时间是否一致
public Boolean check_video_time(String source,String target) {
String source_time = get_video_time(source);
//取出时分秒
source_time = source_time.substring(0,source_time.lastIndexOf("."));
String target_time = get_video_time(target);
//取出时分秒
target_time = target_time.substring(0,target_time.lastIndexOf("."));
if(source_time == null || target_time == null){
return false;
}
if(source_time.equals(target_time)){
return true;
}
return false;
}
//获取视频时间(时:分:秒:毫秒)
public String get_video_time(String video_path) {
/*
ffmpeg -i lucene.mp4
*/
List<String> commend = new ArrayList<String>();
commend.add(ffmpeg_path);
commend.add("-i");
commend.add(video_path);
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
//将标准输入流和错误输入流合并,通过标准输入流程读取信息
builder.redirectErrorStream(true);
Process p = builder.start();
String outstring = waitFor(p);
System.out.println(outstring);
int start = outstring.trim().indexOf("Duration: ");
if(start>=0){
int end = outstring.trim().indexOf(", start:");
if(end>=0){
String time = outstring.substring(start+10,end);
if(time!=null && !time.equals("")){
return time.trim();
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public String waitFor(Process p) {
InputStream in = null;
InputStream error = null;
String result = "error";
int exitValue = -1;
StringBuffer outputString = new StringBuffer();
try {
in = p.getInputStream();
error = p.getErrorStream();
boolean finished = false;
int maxRetry = 600;//每次休眠1秒,最长执行时间10分种
int retry = 0;
while (!finished) {
if (retry > maxRetry) {
return "error";
}
try {
while (in.available() > 0) {
Character c = new Character((char) in.read());
outputString.append(c);
System.out.print(c);
}
while (error.available() > 0) {
Character c = new Character((char) in.read());
outputString.append(c);
System.out.print(c);
}
//进程未结束时调用exitValue将抛出异常
exitValue = p.exitValue();
finished = true;
} catch (IllegalThreadStateException e) {
Thread.currentThread().sleep(1000);//休眠1秒
retry++;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
return outputString.toString();
}
public static void main(String[] args) throws IOException {
String ffmpeg_path = "D:\\Program Files\\ffmpeg-20180227-fa0c9d6-win64-static\\bin\\ffmpeg.exe";//ffmpeg的安装位置
VideoUtil videoUtil = new VideoUtil(ffmpeg_path);
String video_time = videoUtil.get_video_time("E:\\ffmpeg_test\\1.avi");
System.out.println(video_time);
}
}
21.雪花snowflake算法
package com.example.yurgqg.util;
public class Xuehua {
private long workerId;
private long datacenterId;
private long sequence;
public Xuehua(long workerId, long datacenterId, long sequence) {
// sanity check for workerId
// 这儿不就检查了一下,要求就是你传递进来的机房id和机器id不能超过32,不能小于0
if (workerId > maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(
String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
}
if (datacenterId > maxDatacenterId || datacenterId < 0) {
throw new IllegalArgumentException(
String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
}
System.out.printf(
"worker starting. timestamp left shift %d, datacenter id bits %d, worker id bits %d, sequence bits %d, workerid %d",
timestampLeftShift, datacenterIdBits, workerIdBits, sequenceBits, workerId);
this.workerId = workerId;
this.datacenterId = datacenterId;
this.sequence = sequence;
}
private long twepoch = 1288834974657L;
private long workerIdBits = 5L;
private long datacenterIdBits = 5L;
// 这个是二进制运算,就是 5 bit最多只能有31个数字,也就是说机器id最多只能是32以内
private long maxWorkerId = -1L ^ (-1L << workerIdBits);
// 这个是一个意思,就是 5 bit最多只能有31个数字,机房id最多只能是32以内
private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
private long sequenceBits = 12L;
private long workerIdShift = sequenceBits;
private long datacenterIdShift = sequenceBits + workerIdBits;
private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
private long sequenceMask = -1L ^ (-1L << sequenceBits);
private long lastTimestamp = -1L;
public long getWorkerId() {
return workerId;
}
public long getDatacenterId() {
return datacenterId;
}
public long getTimestamp() {
return System.currentTimeMillis();
}
public synchronized long nextId() {
// 这儿就是获取当前时间戳,单位是毫秒
long timestamp = timeGen();
if (timestamp < lastTimestamp) {
System.err.printf("clock is moving backwards. Rejecting requests until %d.", lastTimestamp);
throw new RuntimeException(String.format(
"Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
}
if (lastTimestamp == timestamp) {
// 这个意思是说一个毫秒内最多只能有4096个数字
// 无论你传递多少进来,这个位运算保证始终就是在4096这个范围内,避免你自己传递个sequence超过了4096这个范围
sequence = (sequence + 1) & sequenceMask;
if (sequence == 0) {
timestamp = tilNextMillis(lastTimestamp);
}
} else {
sequence = 0;
}
// 这儿记录一下最近一次生成id的时间戳,单位是毫秒
lastTimestamp = timestamp;
// 这儿就是将时间戳左移,放到 41 bit那儿;
// 将机房 id左移放到 5 bit那儿;
// 将机器id左移放到5 bit那儿;将序号放最后12 bit;
// 最后拼接起来成一个 64 bit的二进制数字,转换成 10 进制就是个 long 型
return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift)
| (workerId << workerIdShift) | sequence;
}
private long tilNextMillis(long lastTimestamp) {
long timestamp = timeGen();
while (timestamp <= lastTimestamp) {
timestamp = timeGen();
}
return timestamp;
}
private long timeGen() {
return System.currentTimeMillis();
}
// ---------------测试---------------
public static void main(String[] args) {
Xuehua xuehua = new Xuehua(1, 1, 1);
for (int i = 0; i < 30; i++) {
System.out.println(xuehua.nextId());
}
}
}