# CommonUtil
**Repository Path**: ht4859/CommonUtil
## Basic Information
- **Project Name**: CommonUtil
- **Description**: 轻便简单的Java常用工具类库
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-06-02
- **Last Updated**: 2021-06-02
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 目录
- [概述](#概述)
- [导入项目](#导入项目)
- [工具类介绍](#工具类介绍)
- [FastJsonUtil(FastJson工具类)](#fastjsonutilfastjson工具类)
- [DateUtil(时间转换工具类)](#dateutil时间转换工具类)
- [CsvUtil(CSV文件工具类)](#csvutilcsv文件工具类)
- [RegexUtil(正则工具类)](#regexutil正则工具类)
- [LanguageUtil(语言工具类)](#languageutil语言工具类)
- [NetworkUtil(获取本地IP和主机名工具类)](#networkutil获取本地ip和主机名工具类)
- [BigDecimalUtil(BigDecimal计算工具类)](#bigdecimalutilbigdecimal计算工具类)
- [HttpUtil(http请求工具类)](#httputilhttp请求工具类)
- [CoordinateTransformUtil(坐标系转换工具类)](#coordinatetransformutil坐标系转换工具类)
- [EncodeDecodeUtil(编码与解码工具类)](#encodedecodeutil编码与解码工具类)
- [ProtobufUtil(提供Protobuf格式的序列化和反序列)](#protobufutil提供protobuf格式的序列化和反序列)
- [DeepCopyUtil(深拷贝工具类)](#deepcopyutil深拷贝工具类)
- [GZIPUtil(通过Gzip算法压缩和解压)](#gziputil通过gzip算法压缩和解压)
- [CaptchaUtil(验证码工具类)](#captchautil验证码工具类)
- [UrlParamsUtil(对URL参数处理的工具类)](#urlparamsutil对url参数处理的工具类)
- [LangArabicNumConvertUtil(语言数字与阿拉伯数字转换工具类)](#langarabicnumconvertutil语言数字与阿拉伯数字转换工具类)
- [StringUtil(字符串工具类)](#stringutil字符串工具类)
- [EmailUtil(邮件发送工具类)](#emailutil邮件发送工具类)
- [XmlConfUtil(解析XMl配置工具类)](#xmlconfutil解析XMl配置工具类)
- [关于开源](#关于开源)
- [Contributor](#contributor)
- [更新日志](#更新日志)
## 概述
本仓库是Java开发常用工具类的总结,旨在追求给大家提供一个轻便简单的工具类库,同时能够cover住大家80%以上的工具类的需求。如果对你有用欢迎点个star,此外,如果你有兴趣和我一起维护该仓库,欢迎提PR或者issue,让我们为拥有一个更强大的工具库而一同努力。
## 导入项目
```
io.github.ljwlgl
common-util
2.1.0
```
## 工具类介绍
### **FastJsonUtil(FastJson工具类)**
借助FastJson实现序列化和反序列,同时自己实现了Json节点增删改,以及Json关键字段脱敏
- **toJsonString(Object object)**, 序列化Json
- **toJsonString(Object object, String... reAttrs)**,序列化Json转时删除不必要的属性
- **isJSON(String str)**,判断是否是Json串
- **eval(String json, String path)**, 从Json中根据Path取出对象
- **eval(String json, String path, Class clz)**, 根据path从json中取出结果并反序列成JavaBean
- **List evals(String json, String path, Class clz)**, 根据path从json中取出结果并反序列成JavaBean,该方法只支持array
- **remove(String json, String path)**,根据path删除指定属性
- **replace(String json, String path, Object value)**,根据path替换指定属性, 只支持JSONObject
- **replaceNew(String json, String path, String value)**,根据path替换指定属性, 支持JSONArray,但是不支持路径表达式
- **put(String json, String path, Object obj)**,根据path向json加入指定对象,只支持JSONObject
- **parseObject(String json, Class clazz)**,反序列化Json
- **List parseArray(String json, Class clazz)**,反序列化List
- **String getJsonValue(String jsonStr, String key)**,获取Json字符串某节点的值
- **containsKey(String jsonStr, String key)**,判断Json串是否包含某个节点
- **containsKey(String jsonStr, String... keys)**,判断Json串是否包含某些属性
- **String encryptJson(String json, List paths)**,加密json的节点属性,可以对关键字段脱敏,支持JsonArray
- **String encryptToJson(JSONObject preObject, String[] paths)**,同上
### **DateUtil(时间转换工具类)**
在日常开发过程中,我们进程会需要把Date转成String,或者把String转成Date,该工具类大致上能满足我们日志开发需要:
- **getCurrentDate()**,获取当期日志,只包含日期
- **calcIntervalDays(Date date1, Date date2)**,计算两个日期间隔的天数
- **dayOfWeek(Date date)**,返回data对应的是星期几
- **getTodayMinutes()**,获取今天的分钟数,如今天18:05,则返回1805
- **getIntervalDate(Date time, int days)**,获取指定间隔天数的日期,比如昨天 getIntervalDate(new Date(), -1)
- **dateToShortDateString(Date date)**,将date转成String,输出String只包含年月日
- **dateToString(Date date)**, 将date转成String,输出String包含年月日时分秒
- **stringToDate(String dateStr)**,将String转成Date,默认时区东八区,TimeZone.getTimeZone("Asia/Shanghai")
- **dateToVoString(Date date)** ,后端经常会根据传入Date生成View层的String传给前端,该方法计算成相应中文,会例如:
- 1分钟内:刚刚
- 超过1分钟并在1小时内:某分钟前 (1分钟前)
- 超过1小时并在当日内:某小时前(1小时前)
- 昨天:昨天 + 小时分钟(昨天 08:30)
- 昨天之前并在当年内:某月某日 + 小时分钟(1月1日 08:30)
- 隔年:某年某月某日 + 小时分钟(2017年1月1日 08:30)
### **CsvUtil(CSV文件工具类)**
csv作为开发常常需要处理的文件格式,本项目主要提供以下工具方法:
- **List read(String filePath, String code, boolean needHeader)**,读取CSV文件,(参数说明,needHeader:是否需要列标题;)
- **List read(InputStream inputStream, Charset charset, boolean needHeader, int[] columns)**,读取CSV文件,(参数说明,needHeader:是否需要列标题;columns: 指定读取csv文件的哪几列,如果为null,则读取全部列)
- **List read(...)**,读取CSV文件的多个重载方法
- **write(List list, String filePath, boolean append)**,写入CSV文件(参数说明,append:是否以追加的方式写入)
### **RegexUtil(正则工具类)**
- **isMobileExact(CharSequence input)**,是否是手机号
- **isEmail(CharSequence input)**,是否是email
- **isURL(CharSequence input)**,是否是URL
- **isIP(CharSequence input**,是否是IP
- **isMatch(String regex, CharSequence input)**,是否匹配正则表达式
- **getMatches(String regex, CharSequence input)**,获取正则表达式的部分
- ...
### **LanguageUtil(语言工具类)**
多语言场景工具类,可以借助下面工具类判断字符是哪种locale
- **isOnlyLetter(String str)**,是否只有字母
- **isLetter(String str)**,是否有字母和空格
- **isChinese(String str)**,是否只有汉字和空格
- **isLetterAndNumber(String str)**,是否只有字母、数字和空格
- **isChineseAndNumber(String str)**,是否只有汉字、数字和空格
- **isKoreanAndNumber(String str)**,是否只有韩语、数字和空格
- **isJapanAndNumber(String str)**,是否只有日文和数字
### **NetworkUtil(获取本地IP和主机名工具类)**
拿到本机IP不是一件困难的事,但是拿到正确的就比较难了,本工具类,是参考了开源项目[CAT](https://github.com/dianping/cat)内部的实现,提供静态方法如下:
- **getLocalHostAddress()**,返回本机IP
- **getLocalHostName()**,返回主机名
- **getLocalInetAddress**,返回InetAddress
### **BigDecimalUtil(BigDecimal计算工具类)**
在和钱打交道的服务里,经常会用到BigDecimal类,下面提供一些他的计算方法
- **subtract(double x, double y)**
- **add(double x, double y)**
- **multiply(double x, double y)**
- **divide(double x, double y, int scale)**
- **roundUp(double val)**,近似处理,向上取整
- **roundUp(double val, int scale)**, 近似处理,向上取整,scale保留点的位数
- **roundDown(double val)**
- **roundDown(double val, int scale)**
### **HttpUtil(http请求工具类)**
在服务里请求别的接口也是很常见的事
- **doGet(String url, Map queryParam)**,get请求,queryParam是参数
- **doPost(String url, Map params, String json)**,json 请求体内是json字符串
- ... doPost的重载方法
### **CoordinateTransformUtil(坐标系转换工具类)**
各坐标系相互转换,如bd09,wgs84,gcj02
- **convertLatLonByCoordinate(String newCoordinateType, String originalCoordinateType, double lat, double lon)**,将原本坐标系的经纬度转换成新的坐标系的经纬度,支持wgs84转bd09,bd09T转gcj02d等
### **EncodeDecodeUtil(编码与解码工具类)**
- **encodeWithMD5(String str)**, 对字符串进行MD5加密
- **encodeWithSHA1(String str)**,对字符串进行SHA1加密
- **encodeWithSHA256(String str)**,对字符串进行SHA-256加密
- **encode(String algorithm, String str)**,通过指定算法对字符串加密
- **encodeBase64(String str)**,对字符串进行Base64编码
- **decodeBase64(String str)**,对字符串进行Base64解码
- **encodeUrl(String str)**,对URL编码
- **decodeUrl(String str)**,对URL解码
### **ProtobufUtil(提供Protobuf格式的序列化和反序列)**
- ** byte[] serialize(T obj)**,序列化对象
- ** byte[] serializeList(List objList)**,序列化数组
- ** T unSerialize(byte[] data,Class> clazz)**,反序列化对象
- ** List unSerializeList(byte[] data, Class clazz)**,反序列化数组
### **DeepCopyUtil(深拷贝工具类)**
- **Object depthClone(Object srcObj)**,单个对象的深拷贝,通过序列化与反序列的方式实现,所以srcObj对应的需实现java.io.Serializable接口
- ** List listDepthClone(List list)**,多个对象的深拷贝,srcObj对应的需实现java.io.Serializable接口
### **GZIPUtil(通过Gzip算法压缩和解压)**
- **compress(String str)**,字符串压缩为GZIP字节数组
- **compress(String str, String encoding)**,字符串压缩为GZIP字节数组
- **uncompress(byte[] bytes)**,GZIP解压缩
### **CaptchaUtil(验证码工具类)**
- **String genCaptcha(int count)**,生成指定位数为count的随机验证码
- **BufferedImage genCaptchaImg(String captcha)**,为一个验证码生成一个图片
### **UrlParamsUtil(对URL参数处理的工具类)**
- **String join(Map map, String separator)**,将Map转成String, 可以指定分隔符,通常用于拼接URL后面的参数
- **Map split(String paramsPath, String separator)**,解析ulr参数为map
- **Map split(String paramsPath)**,解析ulr参数为map,这里的separator参数为“=”
- **Map build(String ... keyValues)**,将keyValues转成Map
- **add(Map originMap, String ... keyValues)**,在原Map添加keyValues
### **LangArabicNumConvertUtil(语言数字与阿拉伯数字转换工具类)**
- **String lang2ArabicNumber(String word, String majorLocale)**,将语言数字转成阿拉伯数字,目前只支持英语和中文的转换,使用请参考示例[LangArabicNumConvertUtil](#LangArabicNumConvertUtil)(参数说明,majorLocale:中文zh或英语en)
- **String arabic2LangNumber(String word, String majorLocale)**,将阿拉伯数字转成语言数字,该方法暂不支持
### **StringUtil(字符串工具类)**
对于字符串工具类,优先推荐使用org.apache.commons.lang3下的StringUtils以及java.lang.String的自带方法,本工具类只是补充了一些个别方法。
- **String replaceString(String str, Map oldNewMap)**, 批量替换字符
- **String subArr2String(int i, int j, char[] arr)**,将字符数组的子集合成新的字符串
- **String subArr2String(int i, int j, String[] arr, String separator)**,将字符串数组的子串合成一个新的字符串
- **double castDouble(Object obj, double defaultValue)**,转为double类型 ,如果obj为null或者空字符串或者格式不对则返回defaultValue
- **double cast...(Object obj, double defaultValue)**,转换成对应的基础类型
### **EmailUtil(邮件发送工具类)**
邮件工具类是通过JavaEmail实现,企业级项目一般都会专门的服务去发送邮件,但如果自己的小Demo,用工具类发送Email也未尝不可。示例Demo如下,有兴趣的可以fork代码自己研究一下,代码有详情的注释。
```java
public class EmailUtilTest {
@Before
public void before() throws GeneralSecurityException {
// 发送邮箱配置,授权密码可以去邮件运营商获取
EmailUtil.config(EmailUtil.SMTP_QQ(false), "xxx@qq.com", "xxxxxx");
}
@Test
public void testSendText() throws MessagingException {
System.out.println("test");
}
}
```
### **xmlconfutil解析XMl配置工具类**
解析工具通过JAXB实现,主要用于xml配置文件的实例化,以及生成配置类javaBean对应的xml
- ** T xml2JBean(Class> clazz, InputStream in)**,将xml实例化为T类型实例
- **void jBean2Xml(Object instance, OutputStream out)**,将配置类实例instance解析为xml
## 关于开源
本项目是开源项目,若有摘取本项目的代码,请注明出处!(码字不易,请尊重开源精神)
## Contributor
下面是笔者收集的一些对本仓库提过有价值的pr或者issue的朋友,如果你也对本仓库提过不错的pr或者issue的话,你可以发邮件(2715815264@qq.com)与我联系。
**简单说明PR原则**
- 注释需要完备,应该对新增的每个方法标注方法说明,同时对传入参数和返回参数也要相应的说明
- 充分的Unit Test,保证每行代码和分支都要覆盖到
- 代码规范,请遵循[阿里巴巴Java开发手册](https://yq.aliyun.com/articles/69327)
## 使用示例
### LangArabicNumConvertUtil
```java
// 中文转阿拉伯数字示例
LangArabicNumConvertUtil.lang2ArabicNumber("北京三里墩五星小区第陆拾肆栋六零二室", "zh")
// 英文转阿拉伯数字示例
LangArabicNumConvertUtil.lang2ArabicNumber("six six six Beijing abnormalities mottoes Litun two hundred and sixties-five Hotel seven thousand eight hundred and ninety-four", "en")
// 输出
// 北京3里墩5星小区第64栋602室
// 666 beijing abnormalities mottoes litun 200 and sixties-five hotel 7894
```
## 更新日志
- 2018年08月
- 创建项目
- 2020年05月
- 新增LanguageUtil、EncodeDecodeUtil、CaptchaUtil
- 发布2.0.7、2.0.8、2.0.9版本
- 修复BigDecimalUtil错误的构造方法
- 补充一些method的注释
- 2020年06月
- 发布2.1.0版本
- 新增CsvUtil、LangArabicNumConvertUtil、StringUtil
- 补充单元测试