几款Java常用基础工具库
通用工具类(字符串、时间格式化、BeanUtils、IO)
1. commons-lang3库
1.1. org.apache.commons.lang3.StringUtils类
日常代码中,我们经常和String字符串打交道,经常对字符串进行处理,稍微不注意的话,很容易出现类似NullPointerException这种简单的错误,我们经常写各种if来判断处理这些非业务的逻辑。这时,我们可以利用大牛apache的轮子,通过其StringUtils里面的一些常用方法,改善我们的代码,让我们的业务代码更简洁、优雅。示例代码:
@Slf4j
public class AppTest {
@Test
public void stringUtils(){
String a = " ";
String b = null;
//判断字符对象是否为空以及内容是否为空串(有空格则认为不是空串)
log.info("StringUtils.isEmpty(a): {}", StringUtils.isEmpty(a));
//判断字符对象是否为空以及内容是否为空串(有空格也会认为是空串)
log.info("StringUtils.isBlank(a): {}", StringUtils.isBlank(a));
//当b=null时,如果b.trim()则会报空指针异常,使用StringUtils.trim(b)可以避免
log.info("StringUtils.trim(d): {}", StringUtils.trim(b)); String num = "12.3";
//当b=null时,如果b.trim()则会报空指针异常,使用StringUtils.trim(b)可以避免
log.info("org.apache.commons.lang3.StringUtils.isNumericSpace(): {} isNumber: {}", num, StringUtils.isNumericSpace(b));
log.info("com.alibaba.druid.util.StringUtils.isNumber(): {} isNumber: {}", num, com.alibaba.druid.util.StringUtils.isNumber(num));
}
}
注意:common-lang3中的StringUtils. isNumeric()或isNumericSpace()并不能判断字符串中带小数点的数字值字符为数字。可以通过com.alibaba.druid.util.StringUtils.isNumber(str),此方法来判断。
1.2 org.apache.commons.lang3.time.DateFormatUtils/DateUtils
时间转换工具类:
@Test
public void dateFormatUtils() throws Exception{
String pattern = "yyyy-MM-dd HH:mm:ss";
String timeStr = DateFormatUtils.format(new Date(), pattern);
long timestamp = DateUtils.parseDate(timeStr, pattern).getTime();
log.info("==> current time: {}", timeStr);
log.info("==> current time timestamp: {}", timestamp);
}
总结
- StringUtils.isEmpty(str)/StringUtils.isNotEmpty(str): 判断字符对象是否为null或空串(有空格则认为不是空串)
- StringUtils.isBlank(str)/StringUtils.isNotBlank(str): 判断字符对象是否为null或空串(有空格也会认为是空串)
- DateFormatUtils.format(date, pattern): 将Date时间对象按表达式的格式转换成时间字符串
- DateUtils.parseDate(timeStr, pattern): 将时间字符串反转成Date对象
- ToStringBuilder.reflectionToString(obj): 将对象内容转换成字符串输出(下一节有使用到)
- ...
对于学习某个工具类,我们可以通过Intellij IDEA中可通过打开此类的源代码,然后通过快捷键(MacOS: command+7; Windows: Alt+7)打开查看类方法列表(Structure),从方法名字上大概可以看出具体有那些适合自己使用的方法。
以上示例使用到的jar包可通过maven的pom.xml文件依赖导入:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.</version>
</dependency>
2.common-beanutils库
Map、JavaBean是我们日常业务代码中经常使用到的2种类,有时因为业务原因,Map、JavaBean需要相互转换copy啥的操作时,如果手动set/put,字段多的时候,就要吐血了。这里我们推荐使用BeanUtils来简化我们的代码
2.1.org.apache.commons.beanutils.BeanUtils类
@Test
public void beanUtils() throws InvocationTargetException, IllegalAccessException {
CompanyBean bean = new CompanyBean();
bean.setId();
bean.setName("中国移动广州分公司");
bean.setAddress("广州市天河区中山大道");
bean.setTel("020-10086000");
CompanyBean destObj = new CompanyBean();
//复制bean之间复制内容, 新对象destObj需要先实例化
BeanUtils.copyProperties(destObj, bean);
//ToStringBuilder类来自commons-lang3库:将对象内容转换成字符串输出,方便于日志输出
log.info("destObj from BeanUtils.copyProperties: {}", ToStringBuilder.reflectionToString(destObj)); Map<String, Object> map = new HashMap<>();
map.put("id", );
map.put("name", "中国联通广州分公司");
map.put("address", "广州市天河区中山大道2号");
map.put("tel", "020-10000110");
//将map(key,value)映射成bean
BeanUtils.populate(destObj, map);
log.info("destObj from BeanUtils.populate: {}", ToStringBuilder.reflectionToString(destObj));
//复制对象,与copyProperties()方法比较,这里新对象可以不先实例化
CompanyBean cloneBean = (CompanyBean)BeanUtils.cloneBean(destObj);
log.info("cloneBean from BeanUtils.cloneBean: {}", ToStringBuilder.reflectionToString(cloneBean));
//将JavaBean转换成Map
Map newMap = BeanUtils.describe(cloneBean);
log.info("newMap from BeanUtils.describe: {}", new Gson().toJson(newMap));
}
日志输出如下:
-- ::21.064 [main] INFO com.monbuilder.AppTest - destObj from BeanUtils.copyProperties: com.monbuilder.bean.CompanyBean@10683d9d[id=,name=中国移动广州分公司,address=广州市天河区中山大道1号,tel=-]
-- ::21.070 [main] INFO com.monbuilder.AppTest - destObj from BeanUtils.populate: com.monbuilder.bean.CompanyBean@10683d9d[id=,name=中国联通广州分公司,address=广州市天河区中山大道2号,tel=-]
-- ::14.966 [main] INFO com.monbuilder.AppTest - newMap from BeanUtils.describe: {"address":"广州市天河区中山大道2号","name":"中国联通广州分公司","tel":"020-10000110","id":"","class":"class com.monbuilder.bean.CompanyBean"}
总结
- BeanUtils.copyProperties(destObj, sourceObj): JavaBean之间内容的复制
- BeanUtils.cloneBean(obj): 复制对象
- BeanUtils.populate(destObj, sourceMap): Map转换成JavaBean
- BeanUtils.describe(bean): 将JavaBean转换成Map
3.commons-io库
org.apache.commons.io.IOUtils类
这个io工具类非常有用,当我们在处理流的过程中,经常需要把流与字节数组之间相互转换,以及在处理完之后,关闭流等等这些操作时,我们需要写挺多处理逻辑,close时还需要写if判空啥的,但是使用了这个IOUtil后,我们的处理代码或简洁非常多的。
@Test
public void ioUtils() throws IOException {
InputStream io = this.getClass().getClassLoader().getResourceAsStream("README.md");
BufferedReader br = new BufferedReader(new InputStreamReader(io));
log.info("==> IOUtils.toString(br): {}", IOUtils.toString(br));
IOUtils.closeQuietly(br);
IOUtils.closeQuietly(io);
}
-- ::26.140 [main] INFO com.monbuilder.AppTest - ==> IOUtils.toString(br): toolkit-demo,工具类库使用示例
上面只是简单的展示将文件流内容转换成字符串,之后再关闭流,是不是非常简洁呢?IOUtils里面还有非常多的好方法可以使用,这些可以根据自己在具体的工作场景下,查看IOUtils的方法列表,找到自己需要的方法
总结
IOUtils常用的方法有:
- IOUtils.closeQuietly(obj): 可关闭流SocketSocketServer等多种对象
- IOUtils.copy(InputStream, Writer): 复制输入流
- IOUtils.write(byte[], OutputStream): 将字节数组转换成流
- IOUtils.toByteArray(InputStream): 将输入流转换成字节数组
- IOUtils.toInputStream(String): 将字符串转换成输入流
- IOUtils.toString(InputStream): 将输入流转换成字符串
上面介绍的都是来自于apache官方的类库,还有好多类与方法有待我们发掘使用。另外,还介绍另1个非常有名的工具类库:guava,来自于Google;功能也有类似的,当然也有很多的扩展使用,本文就不再详细介绍了。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.2-jre</version>
</dependency>
JSON工具类
在如今REST API盛行的年代,前后端分离成为标配,json成为两者之间的传输桥梁,在我们工作做打交道肯定非常频繁咯。在Java开发中,JSON工具类的选择并不少:
- fastjson 阿里巴巴出品,转换快,但表现不够稳定
- Gson google出品,使用简单,轻量
- Jackson spring官方使用,性能快,转换快,配置更灵活,不同场景下表现更稳定
比较推荐使用的是Jackson,如果我们使用Spring Boot或Spring Cloud时,构建web项目里面内置的json库就是Jackson库。
下面通过Jackson库简单封装成JavaBean/json互转的工具类:
package com.monbuilder.util;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import java.text.SimpleDateFormat;
/***
* JSON转换工具类
* @author <a href="mailto:lcbiao34@gmail.com">Builder34</a>
* @date 2018-11-01 11:14:26
* */
@Slf4j
public class JacksonUtil {
private static ObjectMapper objectMapper = new ObjectMapper();
static {
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
objectMapper.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true);
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
// 设置输入时忽略JSON字符串中存在而Java对象实际没有的属性
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //设置不输出值为 null 的属性
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
/**
* 将JSON字符串根据指定的Class反序列化成Java对象(转换过程中出现异常则返回null对象)
*
* @param json JSON字符串
* @param objClass JavaObject对象Class
* @return 反序列化生成的Java对象
* */
public static <T> T toJavaObject(String json, Class<T> objClass) {
try {
return objectMapper.readValue(json, objClass);
} catch (Exception e) {
log.error("", e);
return null;
}
}
/**
* 将Java对象序列化成JSON字符串(转换过程中出现异常则返回空对象json串"{}")
*
* @param obj 待序列化生成JSON字符串的Java对象
* @return JSON字符串
*/
public static String toJsonString(Object obj) {
try {
return objectMapper.writeValueAsString(obj);
} catch (Exception e) {
log.error("",e);
}
return "{}";
}
}
运用上面的工具类,示例:
@Test
public void jsonUtils(){
CompanyBean bean = new CompanyBean();
bean.setId();
bean.setName("中国移动广州分公司");
bean.setAddress("广州市天河区中山大道1号");
bean.setTel("020-10086000");
log.info("==> JacksonUtil.toJsonString(bean): {}", JacksonUtil.toJsonString(bean));
String json = JacksonUtil.toJsonString(bean);
log.info("==> JacksonUtil.toJavaObject: {}", ToStringBuilder.reflectionToString(JacksonUtil.toJavaObject(json, CompanyBean.class))); }
-- ::16.081 [main] INFO com.monbuilder.AppTest - ==> JacksonUtil.toJsonString(bean): {"id":,"name":"中国移动广州分公司","address":"广州市天河区中山大道1号","tel":"020-10086000"}
-- ::16.144 [main] INFO com.monbuilder.AppTest - ==> JacksonUtil.toJavaObject: com.monbuilder.bean.CompanyBean@376a0d86[id=,name=中国移动广州分公司,address=广州市天河区中山大道1号,tel=-]
上面涉及到的示例代码,皆可以通过打开Github地址[https://github.com/Builder34/toolkit-demo] 获取。
https://www.toutiao.com/i6648120854502703620/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1×tamp=1548034130&app=news_article&utm_source=weixin&iid=54172054558&utm_medium=toutiao_ios&group_id=6648120854502703620
轮子非常多,当然我们可以重复造轮子,但是我们更提倡的是使用已有优秀的轮子(工具类),开发出更简洁、优雅、业务逻辑更清晰的代码。
几款Java常用基础工具库的更多相关文章
- 细说Java主流日志工具库
概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...
- java常用基础(一)
Java常用基础(一) 原文写于2017-12-02 输入输出 //输入 Scanner in = new Scanner(new BufferedInputStream(System.in)); i ...
- Java常用的开发库推荐
我是3y,一年CRUD经验用十年的markdown程序员 今天来讲讲来给大家聊聊开发提速的东西了:工具包.Lombok和常用库 01.什么是工具包 基本上,每个项目里都有一个包,叫做utils.这个 ...
- Java主流日志工具库
在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息.在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子.我们先来逐一了解一下主流日志工具. 1.java.util.lo ...
- JDK的帧--java.util包装工具库
题词 JDK,Java Development Kit. 首先,我们必须认识到,,JDK但,但设置Java只有基础类库.它是Sun通过基础类库开发,这是唯一的.JDK书写总结的类库.从技术含量来说,还 ...
- Java常用测试工具
第一部分:九款性能测试 Java入门 如果你才刚开始接触Java世界,那么要做的第一件事情是,安装JDK——Java Development Kit(Java开发工具包),它自带有Java Runti ...
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...
- java常用基础知识点 (持续追加)
作为一个Java编程人,会经常用上JDK中的大量的API类库,常用的有字符串操作.集合操作.文本操作.输入输出操作.以及网络操作, 常用的包: 1. java.lang Java程序的基础类,字符串, ...
- java常用开发工具类之 图片水印,文字水印,缩放,补白工具类
import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...
随机推荐
- sqlserver 字段内容做in条件 列变成行显示
sqlserver中 字段内容做in条件用到方法:CHARINDEX(value,situation) 列变行显示用到:stuff 详情自行查找. 例子: stuff((select ','+name ...
- JSON Web Token (JWT) 实现与使用方法
1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该 ...
- FishiGUI系统架构分析 和层次结构 二
FishiGUI的类型 FIshiGUI属于为应用程序提供图形界面服务的框架系统.它并不直接与终于用户交互(负责与终于用户交互的是在FishiGUI基础上开发的应用程序).而是接受操作系统传来的硬件消 ...
- docker 让容器执行命令 与 进入容器交互
直接执行命令docker exec mynginx cat /etc/nginx/nginx.conf 进入容器交互docker exec -it 80nginx /bin/bash
- LVM卷组命令
一般维护命令 #vgscan //检測系统中全部磁盘 #vgck [卷组名] //用于检查卷组中卷组描写叙述区域信息的一致性. #vgdisplay [卷组名] //显示卷组的属性信息 #vg ...
- fedora20配置静态ip
在linux的世界里.给主机设置固定ip是这么做的(使用root用户): 1.查看要配的网络接口 用ifconfig查看查看在用的网卡接口,一般都用第一个如:eth0,en1,em1等 2.停用网络自 ...
- [译]GLUT教程 - 交换菜单
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Swapping Menus GLUT甚至可以在应用程序过 ...
- Finder打开剪切功能
在终端里输入 defaults write com.apple.finder AllowCutForItems 1 如果要改回来,把1改成0就可以了.
- 配置LANMP环境(9)-- 安装Git与vsftp
一.安装Git 检查是否已经安装 git --version 安装 yum -y install git 二.安装vsftp 检查是否已经安装 yum list installed vsftpd 安装 ...
- 启用nginx报错80端口被占用
最近在本机跑nginx,启动后报错,怀疑80端口被占用 netstat -ano|findstr 尝试一:查看后发现端口被一个System pid 为4的一个程序占用.我在资源管理器中尝试将Syste ...