通用工具类(字符串、时间格式化、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&timestamp=1548034130&app=news_article&utm_source=weixin&iid=54172054558&utm_medium=toutiao_ios&group_id=6648120854502703620

轮子非常多,当然我们可以重复造轮子,但是我们更提倡的是使用已有优秀的轮子(工具类),开发出更简洁、优雅、业务逻辑更清晰的代码。

几款Java常用基础工具库的更多相关文章

  1. 细说Java主流日志工具库

    概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...

  2. java常用基础(一)

    Java常用基础(一) 原文写于2017-12-02 输入输出 //输入 Scanner in = new Scanner(new BufferedInputStream(System.in)); i ...

  3. Java常用的开发库推荐

    我是3y,一年CRUD经验用十年的markdown程序员‍ 今天来讲讲来给大家聊聊开发提速的东西了:工具包.Lombok和常用库 01.什么是工具包 基本上,每个项目里都有一个包,叫做utils.这个 ...

  4. Java主流日志工具库

    在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息.在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子.我们先来逐一了解一下主流日志工具. 1.java.util.lo ...

  5. JDK的帧--java.util包装工具库

    题词 JDK,Java Development Kit. 首先,我们必须认识到,,JDK但,但设置Java只有基础类库.它是Sun通过基础类库开发,这是唯一的.JDK书写总结的类库.从技术含量来说,还 ...

  6. Java常用测试工具

    第一部分:九款性能测试 Java入门 如果你才刚开始接触Java世界,那么要做的第一件事情是,安装JDK——Java Development Kit(Java开发工具包),它自带有Java Runti ...

  7. JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]

    类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...

  8. java常用基础知识点 (持续追加)

    作为一个Java编程人,会经常用上JDK中的大量的API类库,常用的有字符串操作.集合操作.文本操作.输入输出操作.以及网络操作, 常用的包: 1. java.lang Java程序的基础类,字符串, ...

  9. java常用开发工具类之 图片水印,文字水印,缩放,补白工具类

    import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

随机推荐

  1. ubuntu18.04 安装mysql时'root'@'localhost'无法获取登录权限

    查看一下user表,错误的起因就是在这里, root的plugin被修改成了auth_socket,用密码登陆的plugin应该是mysql_native_password mysql> sel ...

  2. 内网IPC$种马的三种方法

    copy muma.exe \\host\c$\windows\temp\foobar.exe ##IPC拷贝木马文件 WMIC远程运行命令 wmic /node:host /user:adminis ...

  3. Ubuntu 开机引导文件 /etc/default/grub

    # If you change this file, run 'update-grub' afterwards to update # /boot/grub/grub.cfg. GRUB_DEFAUL ...

  4. maven nexus myeclipse 学习

    http://b-l-east.iteye.com/blog/1246482 这篇文章比较详细的介绍了 nexus 本地仓库以及与maven的配合使用 http://blog.csdn.net/arv ...

  5. 为什么返回的数据前面有callback? ashx/json.ashx?的后面加 callback=? 起什么作用 js url?callback=xxx xxx的介绍 ajax 跨域请求时url参数添加callback=?会实现跨域问题

    为什么返回的数据前面有callback?   这是一个同学出现的问题,问到了我. 应该是这样的: 但问题是这样的: 我看了所请求的格式和后台要求的也是相同的.而且我也是这种做法,为什么他的就不行呢? ...

  6. 捕获网络数据包并进行分析的开源库-WinPcap

    什么是WinPcap WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库. 大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets.  这是一种简单的 ...

  7. Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url

    Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url 1.1. 原理流程1 2. Invoke1 3. StrutsX2 1.1. 原理流程 读取struts配 ...

  8. linux命令的别名alias,unalias

    1. 别名 linux别名alias的作用: 1. 简化特别长得命令和參数 2. 对一些命令添加默认选项.提高安全性. 2. alias使用 [www@work sh]$ alias lm='ls - ...

  9. nodejs 学习资料大全

    1.blog学习篇 http://blog.fens.me/series-nodejs/ 从零开始nodejs系列文章

  10. centos7 安装postgresql10

    https://blog.csdn.net/rudy5348/article/details/79299162