阅读完需:约 13 分钟
在 Java 中,工具类通常用来定义一组执行通用操作的方法。本篇将会向大家展示 它们最常用的方法。
1、IOUtils
org.apache.commons.io.IOUtils,操作 IO 流的工具类,下面是其常用的方法。
- 
closeQuietly(),关闭 IO 流,并且忽略 null 值和异常。
IOUtils.closeQuietly(output);- 
copy(),将字节从输入流复制到输出流。
IOUtils.copy(inputStream, new FileOutputStream(File));- 
toByteArray(),以byte[]的形式获取输入流中的内容。
URLConnection conn = new URL(url).openConnection();
InputStream is = conn.getInputStream();
byte[] result = IOUtils.toByteArray(is);- 
write(),将字符或者字节写入输出流中。
IOUtils.write("沉默王二", response.getOutputStream(), "UTF-8");- 
toInputStream(),将指定的字符转成输入流。
String content=req.getParameter("content");
InputStream inputStream=IOUtils.toInputStream(content,"utf-8");
- 
readLines(),从输入流中一行一行地读取,并按照指定的字符编码返回字符串列表。
List<String> lines = IOUtils.readLines(new InputStreamReader(new FileInputStream(file), "utf-8"));
- 
copyLarge(),从输入流中复制内容到输出流,超过 2GB。
private File downloadFile(HttpResponse response) {
    File dir = new File("downloadedFiles");
    if (!dir.exists()) {
        dir.mkdir();
    }
    File outputFile = new File("downloadedFiles/temp" + RandomStringUtils.randomAlphanumeric(3));
    try {
        IOUtils.copyLarge(response.getEntity().getContent(), new FileOutputStream(outputFile));
        return outputFile;
    } catch (Exception e) {
        throw new RuntimeException(e);
    } finally {
        request.releaseConnection();
    }
}
- 
readFully(),把输入流中的内容读入到字节数组中。
byte[] intArray = new byte[Bytes.SIZEOF_INT];
IOUtils.readFully(in, intArray);2、FileUtils
org.apache.commons.io.FileUtils,操作文件或者目录的工具类,下面是其常用的方法。
- 
deleteDirectory(),删除目录。
FileUtils.deleteDirectory(file);
- 
readFileToString(),把文件的内容读入到字符串中。
String fileAsString = FileUtils.readFileToString(reportFile);
- 
deleteQuietly(),删除文件,但不抛出异常。
 FileUtils.deleteQuietly(outputFile);
- 
copyFile(),把文件复制到一个新的位置。
FileUtils.copyFile(source, dest);
- 
writeStringToFile(),把字符串写入到文件。
FileUtils.writeStringToFile(templateFile, generatedText, Charset.forName("UTF-8"));
- 
forceMkdir(),强制创建目录,包括任何必需但不存在的父目录。
File uploadDirectory = new File(this.uploadPath);
if (!uploadDirectory.exists()) {
    FileUtils.forceMkdir(uploadDirectory);
}
- 
write(),把字符或者字节写入到文件。
FileUtils.write(new File("C:\\Users\\cmower\\test.txt"), "沉默王二", "utf-8");
- 
listFiles(),列出指定目录下的所有文件。
public void processResultsDirectory(String dirName) {
    File root = new File(dirName);
    try {
        Collection<File> files = FileUtils.listFiles(root,
                new RegexFileFilter(jmeterJTLFileName),
                DirectoryFileFilter.DIRECTORY);
        for (Iterator<File> iterator = files.iterator(); iterator.hasNext();) {
            File file = (File) iterator.next();
            parse(file);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
- 
copyDirectory(),将目录下的所有子目录及文件复制到新的目录。
 FileUtils.copyDirectory(source, dest);
- 
forceDelete(),强制删除文件或者目录及其所有子目录和文件。
 FileUtils.forceDelete(tmpFile);3、StringUtils
org.apache.commons.lang3.StringUtils,操作字符串的工具类,并且是 null 安全的,下面是其常用的方法。
- 
isBlank(),检查字符是否为空字符串”“,或者 null,或者空格。
if (StringUtils.isBlank(name))
{
throw new IllegalArgumentException("姓名不能为空");
}
检查结果如下所示。
StringUtils.isBlank(null)      = true
StringUtils.isBlank("")        = true
StringUtils.isBlank(" ")       = true
StringUtils.isBlank("沉默王二")     = false
StringUtils.isBlank("  沉默王二  ") = false
- 
isNotBlank(),与isBlank()检查的结果相反。
- 
isEmpty(),检查字符是否为空字符串”“,或者 null;和isBlank()不同,不包括空格的检查。
if (StringUtils.isEmpty(name)) {
    throw new IllegalArgumentException("姓名不能为 null 或者空字符串");
}
检查结果如下所示。
StringUtils.isEmpty(null)      = true
StringUtils.isEmpty("")        = true
StringUtils.isEmpty(" ")       = false
StringUtils.isEmpty("沉默王二")     = false
StringUtils.isEmpty("  沉默王二  ") = false
- 
isNotEmpty(),与isEmpty()检查的结果相反。
- 
join(),将多个元素连接成一个字符串。
StringUtils.join(null)            = null
StringUtils.join([])              = ""
StringUtils.join([null])          = ""
StringUtils.join(["沉默", "王二"]) = "沉默王二"
StringUtils.join([null, "", "一枚有趣的程序员"]) = "一枚有趣的程序员"
- 
equals(),比较两个字符序列是否相等。
StringUtils.equals(null, null)   = true
StringUtils.equals(null, "沉默王二")  = false
StringUtils.equals("沉默王二", null)  = false
StringUtils.equals("沉默王二", "沉默王二") = true
StringUtils.equals("cmower", "CMOWER") = false
- 
split(),把字符串拆分为数组,拆分符为空白字符。
 StringUtils.split(null)       = null
 StringUtils.split("")         = []
 StringUtils.split("沉默王二 沉默王三")  = ["沉默王二", "沉默王三"]
 StringUtils.split("沉默王二  沉默王三") = ["沉默王二", "沉默王三"]
 StringUtils.split(" 沉默王二 ")    = ["沉默王二"]
- 
replace(),替换另一个字符串中所有出现的字符串。
StringUtils.replace(null, *, *)        = null
StringUtils.replace("", *, *)          = ""
StringUtils.replace("any", null, *)    = "any"
StringUtils.replace("any", *, null)    = "any"
StringUtils.replace("any", "", *)      = "any"
StringUtils.replace("沉默王二", "二", null)  = "沉默王二"
StringUtils.replace("沉默王二", "二", "")    = "沉默王"
StringUtils.replace("沉默王二", "二", "三")   = "沉默王三"4、FilenameUtils
org.apache.commons.io.FilenameUtils,操作文件名或者路径的工具类,下面是其常用的方法。
- 
getExtension(),获取文件的扩展名。
FilenameUtils.getExtension("牛逼.txt");        --> "txt"
FilenameUtils.getExtension("a/b/牛逼.jpg");    --> "jpg"
FilenameUtils.getExtension("a/牛逼.txt/c");    --> ""
FilenameUtils.getExtension("a/b/c");           --> ""
- 
getBaseName(),获取单纯的文件名或者路径名,文件时去掉路径和扩展名;路径时去掉父级路径。
FilenameUtils.getBaseName("a/b/牛逼.txt");        --> "牛逼"
FilenameUtils.getBaseName("牛逼.txt");            --> "牛逼"
FilenameUtils.getBaseName("a/b/c");               --> c
FilenameUtils.getBaseName("a/b/c/");              --> ""
- 
getName(),如果是文件时,获取文件名和后缀,去掉路径;如果是路径时,去掉父级路径。
FilenameUtils.getName("a/b/牛逼.txt");        --> "牛逼.txt"
FilenameUtils.getName("牛逼.txt");            --> "牛逼.txt"
FilenameUtils.getName("a/b/c");               --> c
FilenameUtils.getName("a/b/c/");              --> ""
- 
concat(),将路径和文件名连接在一起。
FilenameUtils.concat("/foo/", "bar");          -->   /foo/bar
FilenameUtils.concat("/foo", "bar");           -->   /foo/bar
FilenameUtils.concat("/foo", "/bar");          -->   /bar
FilenameUtils.concat("/foo", "C:/bar");        -->   C:/bar
FilenameUtils.concat("/foo", "C:bar");         -->   C:bar (*)
FilenameUtils.concat("/foo/a/", "../bar");     -->   foo/bar
FilenameUtils.concat("/foo/", " ../../bar");    -->   null
FilenameUtils.concat("/foo/", "/bar");        -->   /bar
FilenameUtils.concat("/foo/.. ", "/bar");       -->   /bar
FilenameUtils.concat("/foo", " bar/c.txt");     -->   /foo/bar/c.txt
FilenameUtils.concat("/foo/c.txt", "bar");     -->   /foo/c.txt/bar (!)
- 
wildcardMatch(),检查文件名是否匹配指定的格式。
wildcardMatch("c.txt", "*.txt")      --> true
wildcardMatch("c.txt", "*.jpg")      --> false
wildcardMatch("a/b/c.txt", "a/b/*")  --> true
wildcardMatch("c.txt", "*.???")      --> true
wildcardMatch("c.txt", "*.????")     --> false
- 
separatorsToUnix(),将所有分隔符转换为正斜杠的 Unix 分隔符。
FilenameUtils.separatorsToUnix("my/unix/filename");
- 
getFullPath(),获取文件的完整路径。
getFullPath("C:\a\b\c.txt" --> C:\a\b\
getFullPath("~/a/b/c.txt"  --> ~/a/b/
getFullPath("a.txt"        --> ""5、ArrayUtils
org.apache.commons.lang3.ArrayUtils,操作数组的工具类,下面是其常用的方法。
- 
contains(),检查数组中是否包含某个值
public static boolean containsAll(Object[] one, Object[] two) {
    for (Object b : two) {
        if (!ArrayUtils.contains(one, b)) {
            return false;
        }
    }
    return true;
}
- 
addAll(),将所有元素添加到一个数组中。
ArrayUtils.addAll(null, null)     = null
ArrayUtils.addAll(array1, null)   = cloned copy of array1
ArrayUtils.addAll(null, array2)   = cloned copy of array2
ArrayUtils.addAll([], [])         = []
ArrayUtils.addAll([null], [null]) = [null, null]
ArrayUtils.addAll(["a", "b", "c"], ["1", "2", "3"]) = ["a", "b", "c", "1", "2", "3"]
- 
clone(),浅拷贝一个数组。
public QualityGateTask[] getQueue() {
    return (QualityGateTask[]) ArrayUtils.clone(queue);
}
- 
isEmpty(),检查数组是否为 null 或者没有元素。
if (ArrayUtils.isEmpty(objectIds)) {
    throw new IllegalArgumentException("对象的ID不能为空");
}
- 
add(),在数组中添加一个新的元素,原数组不变。
ArrayUtils.add(null, true)          = [true]
ArrayUtils.add([true], false)       = [true, false]
ArrayUtils.add([true, false], true) = [true, false, true]
- 
subarray(),根据起始下标和结束下标截取一个子数组。
public byte[] fetchData(String blobKey, long startIndex, long l) {
  CountingInputStream inputStream = new CountingInputStream(getInputStream(blobKey));
  byte[] bytes = new byte[(int) l];
  try {
    int readSize = inputStream.read(bytes, (int) startIndex, (int) l);
    if (readSize < l) {
      bytes = ArrayUtils.subarray(bytes, 0, readSize - 1);
    }
  } catch (IOException e) {
    LOGGER.warn("Failed to read bytes", e);
  } finally {
    try {
      inputStream.close();
    } catch (IOException ignored) {
      LOGGER.warn("Exception while closing inputStream", ignored);
    }
  }
  return bytes;
}
- 
indexOf(),找出指定数组的下标。
ArrayUtils.indexOf(idxVal, i);6、DigestUtils
org.apache.commons.codec.digest.DigestUtils,加密的工具类,下面是其常用的方法。
- 
md5Hex(),计算字符串的 MD5 摘要,并返回 32 位的十六进制字符。
DigestUtils.md5Hex("沉默王二");
- 
md5(),计算字符串的 MD5 摘要,并返回 16 个元素的字节数组。
DigestUtils.md5("沉默王二");7、StringEscapeUtils
org.apache.commons.text.StringEscapeUtils,字符串的转义和反转义工具类,下面是其常用的方法。
- 
unescapeHtml4(),反转义 HTML。
StringEscapeUtils.unescapeHtml4("<div></div>");-->   <div></div>
- 
escapeHtml4(),转义 HTML。
StringEscapeUtils.escapeHtml4("<div></div>");-->   <div></div>
- 
escapeJava(),转义 Java。
StringEscapeUtils.escapeJava("沉默王二");-->   \u6C89\u9ED8\u738B\u4E8C
- unescapeJava()
StringEscapeUtils.escapeJava("\u6C89\u9ED8\u738B\u4E8C");-->   沉默王二8、BeanUtils
大多数 Java 开发人员习惯于创建 getter/setter 的JavaBean,然后通过调用相应的 getXxx 和 setXxx 方法访问对应字段。但在某些情况下,需要动态访问 Java 对象的属性,org.apache.commons.beanutils.BeanUtils 就派上用场了。
- 
copyProperties(),拷贝所有属性。
private static void dto2Entity() {
    UserDTO user = new UserDTO();
    user.setId(1l);
    user.setUsername("joking");
    user.setCreationDate("2016-04-20");
    
    EUser u = new EUser();
    ConvertUtils.register(new DateStringConverter(), Date.class);
    try {
        BeanUtils.copyProperties(u, user);
    } catch (IllegalAccessException | InvocationTargetException e) {
        e.printStackTrace();
    }
}
其中 UserDTO 类的源码如下所示。
public class UserDTO implements Serializable {
    
    private static final long serialVersionUID = 2963408818099106614L;
    private long id;
    private String username;
    private String creationDate;
    // getter/setter
    @Override
    public String toString() {
        return "UserDTO [id=" + id + ", username=" + username + ", creationDate=" + creationDate + "]";
    }
}
其中 EUser 类的源码如下所示。
public class EUser implements Serializable {
    private static final long serialVersionUID = -692192937932555368L;
    private long id;
    private String username;
    private Date creationDate;
    //getter/setter
    @Override
    public String toString() {
        return "EUser [id=" + id + ", username=" + username + ", creationDate=" + creationDate + "]";
    }
}
其中 DateStringConverter 类的源码如下所示。
public class DateStringConverter implements Converter {
    @SuppressWarnings("unchecked")
    @Override
    public <T> T convert(Class<T> type, Object value) {
        if(type.equals(Date.class) && String.class.isInstance(value)) {
            return (T)DateUtils.convert((String)value);
        } else if(type.equals(String.class) && Date.class.isInstance(value)){
            return (T)DateUtils.format((Date)value);
        } else {
            return (T)value;
        }
    }
}
- 
getProperty(),返回 bean 指定的属性值。
String fieldValue = BeanUtils.getProperty(value, fieldName);
- 
setProperty(),设置 bean 指定的属性值。
BeanUtils.setProperty(object, propertyName, value);9、Collections
Commons Collections增强了Java集合框架。 它提供了几个功能来简化收集处理。 它提供了许多新的接口,实现和实用程序。
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>/**
 * *********** 常用类  ***********
 * 1. org.apache.commons.collections4.CollectionUtils
 *      isEmpty 判断集合是否为空
 *      isNotEmpty 判断集合不为空
 *      isEqualCollection 比较两集合值是否相等, 不考虑元素的顺序
 *      union 并集, 不会去除重复元素
 *      intersection 交集
 *      disjunction 交集的补集
 *      subtract 差集, 不去重
 *      unmodifiableCollection 得到一个集合镜像,不允许修改,否则报错
 *      containsAny 判断两个集合是否有相同元素
 *      getCardinalityMap 统计集合中各元素出现的次数,并以Map<Object, Integer>输出
 *      isSubCollection a是否 b 的子集合, a集合大小 <= b集合大小
 *      isProperSubCollection a是否 b 的子集合, a集合大小 < b集合大小
 *      cardinality 某元素在集合中出现的次数
 *      find 返回集合中满足函数式的唯一元素,只返回最先处理符合条件的唯一元素, 以废弃
 *      filter 过滤集合中满足函数式的所有元素
 *      transform 转换新的集合,对集合中元素进行操作,如每个元素都累加1
 *      countMatches 返回集合中满足函数式的数量
 *      select 将满足表达式的元素存入新集合中并返回新集合元素对象
 *      selectRejected 将不满足表达式的元素存入新集合中并返回新集合元素对象
 *      collect  collect底层调用的transform方法, 将所有元素进行处理,并返回新的集合
 *      addAll  将一个数组或集合中的元素全部添加到另一个集合中
 *      get 返回集合中指定下标元素
 *      isFull 判断集合是否为空
 *      maxSize 返回集合最大空间
 *      predicatedCollection 只要集合中元素不满足表达式就抛出异常
 *      removeAll 删除集合的子集合
 *      synchronizedCollection 同步集合
 *
 * 2. org.apache.commons.collections4.MapUtils
 *      isEmpty 判断Map是否为空
 *      isNotEmpty 判断Map是否不为空
 *      getBoolean 从Map中获取 Boolean, 其重载方法有三个参数, 表示如果转换失败则使用默认值
 *      getBooleanValue 从Map中获取 boolean, 其重载方法有三个参数, 表示如果转换失败则使用默认值
 *      getDouble 从Map中获取 Double, 其重载方法有三个参数, 表示如果转换失败则使用默认值
 *      getDoubleValue 从Map中获取 double, 其重载方法有三个参数, 表示如果转换失败则使用默认值
 *      getFloat 从Map中获取 Float, 其重载方法有三个参数, 表示如果转换失败则使用默认值
 *      getFloatValue 从Map中获取 float, 其重载方法有三个参数, 表示如果转换失败则使用默认值
 *      getInteger 从Map中获取 Integer, 其重载方法有三个参数, 表示如果转换失败则使用默认值
 *      getIntegerValue 从Map中获取 int, 其重载方法有三个参数, 表示如果转换失败则使用默认值
 *      getLong 从Map中获取 Long, 其重载方法有三个参数, 表示如果转换失败则使用默认值
 *      getLongValue 从Map中获取 long, 其重载方法有三个参数, 表示如果转换失败则使用默认值
 *      getString 从Map中获取 String, 其重载方法有三个参数, 表示如果转换失败则使用默认值
 *      getMap 获取Map类型的值
 *      putAll 将二维数组放入Map中
 *
 */
 
                    
