Util类方法总结
时间工具类
根据传入的秒获取时分秒字符串
public static String getDate(Double time ) { int date = time.intValue(); int h = date/3600; String hstr=h>=10?""+h:"0"+h; int m = (date%3600)/60; String mstr=m>=10?""+m:"0"+m; int s = (date%3600)%60; String sstr=s>=10?""+s:"0"+s; return hstr+":"+mstr+":"+sstr; } |
数字工具类
double的精确加减
//乘 public static double multiply(double a, double b) { if (a == 0 || b == 0) { return 0; } return BigDecimal.valueOf(a).multiply(BigDecimal.valueOf(b)).doubleValue(); } //除 public static double divide(double a, double b, RoundingMode mode) { if (a == 0 || b == 0) { return 0; } return BigDecimal.valueOf(a).divide(BigDecimal.valueOf(b), mode).doubleValue(); } //除 public static double divide(double a, double b, int scale, RoundingMode mode) { if (a == 0 || b == 0) { return 0; } return BigDecimal.valueOf(a).divide(BigDecimal.valueOf(b), scale, mode).doubleValue(); } //加 public static double add(double a, double b) { return BigDecimal.valueOf(a).add(BigDecimal.valueOf(b)).doubleValue(); } //减 public static double subtract(double a, double b) { return BigDecimal.valueOf(a).subtract(BigDecimal.valueOf(b)).doubleValue(); }
|
数据工具类
beanCopy工具类
org.springframework.beans.BeanUtils
copyProperties(Object source, Object target)方法
要求 |
source要有get方法,target要有set方法,否则参数复制失败(不会报错都是默认值) 要赋值 |
是否可以为null |
都不能为null,否则报错IllegalArgumentException |
基本类型和封装类型是否可以正常赋值 |
可以赋值成功 |
int赋值给long是否可以 |
不可以,不会报错,但该属性赋值失败 |
long赋值给int是否可以 |
不可以,不会报错,但该属性赋值失败 |
int或Integer赋值给String是否可以 |
不可以,不会报错,但该属性赋值失败 |
相同的 引用类型多属性对象成员属性是否可以赋值成功比附Object |
可以赋值成功 |
相同的List集合成员 |
可以赋值成功 |
source和target都是集合 |
不能赋值成功 |
JSOS格式化工具类
fastjson
JSON
JSON.toJSONString(myobject)
要求 |
myobject要有get方法,否则转换为{} |
是否需要实现Serializable |
不需要 |
myobject是否可以是集合类型 |
可以 |
myobject如果为null |
不会报错,返回字符串nul |
指定字段在json中的名称
JSONObject
JSONObject.parseObject(myJsonString, MyObject.class);
要求 |
myJsonString要为json格式的字符串,否则会报com.alibaba.fastjson.JSONException
|
json字符串中Integer,类String属性 |
可以赋值成功 |
json字符串中String,类Integer属性 |
可以赋值成功 |
json字符串多于或少于类中属性个数 |
可以赋值成功,只赋值匹配正确的属性 |
json字符串中没有类中的属性 |
返回一个属性都是默认值的对象,对象不为null |
示例
public class XgssTest1 {
@Test public void test1(){ //符合对象格式,转换成功 // Student student = JSONObject.parseObject("{\"name\":\"BeJson\",\"age\":88}", Student.class); //符合对象格式,转换成功,缺少的属性赋值为默认值,age赋值为null // Student student = JSONObject.parseObject("{\"name\":\"BeJson\"}", Student.class); //符合对象格式,转换成功,多出的属性不影响对象转换 // Student student = JSONObject.parseObject("{\"name\":\"BeJson\",\"age\":88,\"class\":1}", Student.class); //转换成功,json中为字符串可以转Integer不影响赋值,age被赋值成功 // Student student = JSONObject.parseObject("{\"name\":\"BeJson\",\"age\":\"88\"}", Student.class); //转换成功,json中的数字类型转换String不影响赋值,name被赋值成功 // Student student = JSONObject.parseObject("{\"name\":111,\"age\":88}", Student.class); //转换成功,属性都是默认值,对象不为null // Student student = JSONObject.parseObject("{\"names\":111,\"ages\":88}", Student.class); //转换成功,属性都是默认值,对象不为null // Student student = JSONObject.parseObject("{}", Student.class); //转换成功,对象为null // Student student = JSONObject.parseObject("", Student.class); //转换失败,报错:com.alibaba.fastjson.JSONException Student student = JSONObject.parseObject("6666", Student.class); System.out.println(student); System.out.println(student.getName()); } }
@Data class Student{ private String name; private Integer age; } |
字段名转换
使用@JSONField注解
@JSONField(name="total_count")
private int totalCount;
如果转为json字符串要忽略的字段加上
@JSONField(serialize=false)
遍历JSONObject
JSONObject jsonObj;
jsonObj.forEach
jackson
hutool工具类常用方法
hutool简介
java工具类库
api文档:https://www.hutool.cn/docs/#/
模块 |
介绍 |
hutool-aop |
JDK动态代理封装,提供非IOC下的切面支持 |
hutool-bloomFilter |
布隆过滤,提供一些Hash算法的布隆过滤 |
hutool-cache |
简单缓存实现 |
hutool-core |
核心,包括Bean操作、日期、各种Util等 |
hutool-cron |
定时任务模块,提供类Crontab表达式的定时任务 |
hutool-crypto |
加密解密模块,提供对称、非对称和摘要算法封装 |
hutool-db |
JDBC封装后的数据操作,基于ActiveRecord思想 |
hutool-dfa |
基于DFA模型的多关键字查找 |
hutool-extra |
扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等) |
hutool-http |
基于HttpUrlConnection的Http客户端封装 |
hutool-log |
自动识别日志实现的日志门面 |
hutool-script |
脚本执行封装,例如Javascript |
hutool-setting |
功能更强大的Setting配置文件和Properties封装 |
hutool-system |
系统参数调用封装(JVM信息等) |
hutool-json |
JSON实现 |
hutool-captcha |
图片验证码实现 |
hutool-poi |
针对POI中Excel和Word的封装 |
hutool-socket |
基于Java的NIO和AIO的Socket封装 |
hutool-jwt |
JSON Web Token (JWT)封装实现 |
加入依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.6.3</version>
</dependency>
类型转换Convert
//转换为字符串,给定的值为null,或者转换失败,返回默认值null值 转换失败不会报错
int a = 1;
String aStr = Convert.toStr(a);
//转换为字符串,如果给定的值为null,或者转换失败,返回默认值 转换失败不会报错
String aStr2 = Convert.toStr(a, "默认值");
//转换为指定类型数组
String[] b = {"1", "2", "3", "4"};
Integer[] bArr = Convert.toIntArray(b);
//转换为日期对象,如果给定的值为空,或者转换失败,返回null值
String dateStr = "2017-05-06";//"2017-05-06 11:00:00"
Date date = Convert.toDate(dateStr);
//转换为列表
String[] strArr = {"a", "b", "c", "d"};
List<String> strList = Convert.toList(String.class, strArr);
// 半角转全角
String num = "123456";
System.out.println(Convert.toSBC(num));
// 全角转半角
String num1 = "123456";
System.out.println(Convert.toDBC(num1));
//Unicode 字符串转换
String con = "\\u5468\\u516d\\u8981\\u559d\\u9189";
System.out.println(Convert.unicodeToStr(con));
// 字符串转换为Unicode
System.out.println(Convert.strToUnicode("Hutool 挺好"));
// 毫秒转换为分钟
long a = 19299292;
long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS,TimeUnit.MINUTES);
// 金额转换为人民币大写
double a = 67556.32;
System.out.println(Convert.digitToChinese(a));
时期时间处理DateUtil
//当前时间
Date date = DateUtil.date();
//Calendar转Date
date = DateUtil.date(Calendar.getInstance());
//时间戳转Date
date = DateUtil.date(System.currentTimeMillis());
//自动识别格式转换
String dateStr = "2017-03-01";
date = DateUtil.parse(dateStr);
//自定义格式化转换
date = DateUtil.parse(dateStr, "yyyy-MM-dd");
//格式化输出日期
String format = DateUtil.format(date, "yyyy-MM-dd");
//获得年的部分
int year = DateUtil.year(date);
//获得月份,从0开始计数
int month = DateUtil.month(date);
//获取某天的开始、结束时间
Date beginOfDay = DateUtil.beginOfDay(date);
Date endOfDay = DateUtil.endOfDay(date);
//计算偏移后的日期时间
Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2);
//计算日期时间之间的偏移量
long betweenDay = DateUtil.between(date, newDate, DateUnit.DAY);
//计时器
TimeInterval timer = DateUtil.timer();
ConVertTest();// 执行过程
System.out.println(timer.interval());
字符串工具类StrUtil
String str = "test";
StrUtil.isEmpty(str);//判断是否为空字符串,null或长度为0
StrUtil.isNotEmpty(str);
StrUtil.isBlank(str);//判断是否为空白字符串,null或长度为0或空白字符串
//去除字符串的前后缀,若前后缀不是指定值, 返回原字符串
StrUtil.removeSuffix("a.jpg", ".jpg");
StrUtil.removePrefix("a.jpg", "a.");
获取classPath下的文件ClassPathResource
//获取定义在src/main/resources文件夹中的配置文件
ClassPathResource resource = new ClassPathResource("generator.properties");
Properties properties = new Properties();
properties.load(resource.getStream());
数字处理工具类NumberUtil
可用于各种类型数字的加减乘除操作及判断类型。
double n1 = 1.234;
double n2 = 1.234;
double result;
//对float、double、BigDecimal做加减乘除操作
result = NumberUtil.add(n1, n2);
result = NumberUtil.sub(n1, n2);
result = NumberUtil.mul(n1, n2);
result = NumberUtil.div(n1, n2);
//保留两位小数
BigDecimal roundNum = NumberUtil.round(n1, 2);
String n3 = "1.234";
//判断是否为数字、整数、浮点数
NumberUtil.isNumber(n3);
NumberUtil.isInteger(n3);
NumberUtil.isDouble(n3);
JavaBean的工具类BeanUtil
可用于Map与JavaBean对象的互相转换以及对象属性的拷贝。
PmsBrand brand = new PmsBrand();
brand.setId(1L);
brand.setName("小米");
brand.setShowStatus(0);
//Bean转Map
Map<String, Object> map = BeanUtil.beanToMap(brand);
LOGGER.info("beanUtil bean to map:{}", map);
//Map转Bean
PmsBrand mapBrand = BeanUtil.mapToBean(map, PmsBrand.class, false);
LOGGER.info("beanUtil map to bean:{}", mapBrand);
//Bean属性拷贝
PmsBrand copyBrand = new PmsBrand();
BeanUtil.copyProperties(brand, copyBrand);
// 为null 不覆盖原值
CopyOptions copyOptions = CopyOptions.create().setIgnoreNullValue(true);
BeanUtil.copyProperties(brand, copyBrand,copyOptions);
集合操作工具类CollUtil
//数组转换为列表
String[] array = new String[]{"a", "b", "c", "d", "e"};
List<String> list = CollUtil.newArrayList(array);
//join:集合转字符串时添加连接符号
String joinStr = CollUtil.join(list, ",");
//将以连接符号分隔的字符串再转换为列表
List<String> splitList = StrUtil.split(joinStr, ',');
//创建新的Map、Set、List
HashMap<Object, Object> newMap = CollUtil.newHashMap();
HashSet<Object> newHashSet = CollUtil.newHashSet();
ArrayList<Object> newList = CollUtil.newArrayList();
//判断列表是否为空
CollUtil.isEmpty(list);
Map操作工具类MapUtil
//将多个键值对加入到Map中
Map<Object, Object> map = MapUtil.of(new String[][]{
{"key1", "value1"},
{"key2", "value2"},
{"key3", "value3"}
});
//判断Map是否为空
MapUtil.isEmpty(map);
MapUtil.isNotEmpty(map);
加密工具SecureUtil
md5加密
//MD5加密 String str = "123456"; String md5Str = SecureUtil.md5(str); |
AES加密解密
String content = "test中文";
//随机生成密钥 byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
//构建 AES aes = SecureUtil.aes(key);
//加密 byte[] encrypt = aes.encrypt(content); //解密 byte[] decrypt = aes.decrypt(encrypt);
//加密为16进制表示 String encryptHex = des.encryptHex(content); //解密为原字符串 String decryptStr = des.decryptStr(encryptHex); |
DES加密解密
String content = "test中文"; //随机生成密钥 byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();
//构建 DES des = SecureUtil.des(key);
//加密解密 byte[] encrypt = des.encrypt(content); byte[] decrypt = des.decrypt(encrypt);
//加密为16进制,解密为原字符串 String encryptHex = des.encryptHex(content); String decryptStr = des.decryptStr(encryptHex); |
SymmetricCrypto类
Hutool中针对JDK支持的所有对称加密算法做了封装,封装为SymmetricCrypto类,AES和DES两个类是此类的简化表示。通过实例化这个类传入相应的算法枚举即可使用相同方法加密解密字符串或对象。
String content = "test中文"; //随机生成密钥 byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
//构建 SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);
//加密 byte[] encrypt = aes.encrypt(content); //解密 byte[] decrypt = aes.decrypt(encrypt);
//加密为16进制表示 String encryptHex = aes.encryptHex(content); //解密为字符串 String decryptStr = aes.decryptStr(encryptHex);
|
验证码工具类CaptchaUtil
可用于生成图形验证码
//生成验证码图片 LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100); try { request.getSession().setAttribute("CAPTCHA_KEY", lineCaptcha.getCode()); response.setContentType("image/png");//告诉浏览器输出内容为图片 response.setHeader("Pragma", "No-cache");//禁止浏览器缓存 response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expire", 0); lineCaptcha.write(response.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } |
Http请求工具类HttpUtil
String result = HttpUtil.post("https://fpdk.beijing.chinatax.gov.cn/NSbsqWW/pltj.do", map); |
二维码工具类QrCodeUtil
// 生成二维码 QrCodeUtil.generate("https://hutool.cn/", 300, 300, FileUtil.file("d:/qrcode.jpg")); |
Excel工具ExcelUtil
导出工具类: public void downLoadFile(UserDto dto,HttpServletResponse response) { String outFileName = "测试文件名"+System.currentTimeMillis()+".xlsx"; String ENCODING="UTF-8"; List<Map<String, Object>> users= UserRepository.getUserByIds(dto.getIds()); if(users.isEmpty()){ return; } ExcelWriter writer = ExcelUtil.getWriter(true); // 通过工具类创建writer并且进行别名 assembleWriter(writer); // 准备将对象写入我们的 List writer.write(users, true); try { // 获取我们的输出流 final OutputStream output = response.getOutputStream(); //response.setHeader("Content-Type", "application/octet-stream;charset=utf-8"); // 告诉浏览器输出内容为流 //response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(outFileName, "UTF-8")); response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + outFileName + ";filename*=utf-8''" + URLEncoder.encode(outFileName, ENCODING)); writer.flush(output, true); writer.close(); // 这里可以自行关闭资源或者写一个关闭资源的工具类 IoUtil.close(output); } catch (Exception e) { LogUtil.error("用户导出失败:", e); } } |
private void assembleWriter(ExcelWriter writer) { writer.addHeaderAlias("username", "用户名"); writer.addHeaderAlias("password", "密码"); writer.addHeaderAlias("home", "家乡");
} |
导入工具类: public void importFile(MultipartFile file) throws Exception {
String fileName = file.getOriginalFilename(); // 上传文件为空 if (StringUtils.isEmpty(fileName)) { throw new WorkException( "没有导入文件"); } //上传文件大小为1000条数据 if (file.getSize() > 1024 * 1024 * 10) { LogUtil.error("文件大小超过10M", new WorkException( "文件大小超过10M")); throw new WorkException( "上传失败: 文件大小不能超过10M!"); } // 上传文件名格式不正确 if (fileName.lastIndexOf(".") != -1 && !".xlsx".equals(fileName.substring(fileName.lastIndexOf(".")))) { throw new WorkException( "文件名格式不正确, 请使用后缀名为.xlsx的文件"); } InputStream inputStream = file.getInputStream(); ExcelReader excelReader = ExcelUtil.getReader(inputStream, "sheet1"); assembleReader(excelReader); List<User> all = excelReader.readAll(User.class); for (User user: all) { save(user); //数据入库 } } |
private void assembleReader(ExcelReader reader) { reader.addHeaderAlias("用户名", "username"); reader.addHeaderAlias("密码", "password"); reader.addHeaderAlias("家乡", "home"); |
JSONUtil
JSONUtil.toJsonStr可以将任意对象(Bean、Map、集合等)直接转换为JSON字符串。 如果对象是有序的Map等对象,则转换后的JSON字符串也是有序的。
如果我们想获得格式化后的JSON,则:JSONUtil.toJsonPrettyStr
JSON字符串转实体类JSONUtil.toBean
List转jsonArray:JSONUtil.parseArray
json字符串转jsonArray:JSONUtil.parseArray
jsonArray转为List:JSONUtil.toList