User-Profile-Image
hankin
  • 5
  • Java
  • Kotlin
  • Spring
  • Web
  • SQL
  • MegaData
  • More
  • Experience
  • Enamiĝu al vi
  • 分类
    • Zuul
    • Zookeeper
    • XML
    • WebSocket
    • Web Notes
    • Web
    • Vue
    • Thymeleaf
    • SQL Server
    • SQL Notes
    • SQL
    • SpringSecurity
    • SpringMVC
    • SpringJPA
    • SpringCloud
    • SpringBoot
    • Spring Notes
    • Spring
    • Servlet
    • Ribbon
    • Redis
    • RabbitMQ
    • Python
    • PostgreSQL
    • OAuth2
    • NOSQL
    • Netty
    • MySQL
    • MyBatis
    • More
    • MinIO
    • MegaData
    • Maven
    • LoadBalancer
    • Kotlin Notes
    • Kotlin
    • Kafka
    • jQuery
    • JavaScript
    • Java Notes
    • Java
    • Hystrix
    • Git
    • Gateway
    • Freemarker
    • Feign
    • Eureka
    • ElasticSearch
    • Docker
    • Consul
    • Ajax
    • ActiveMQ
  • 页面
    • 归档
    • 摘要
    • 杂图
    • 问题随笔
  • 友链
    • Spring Cloud Alibaba
    • Spring Cloud Alibaba - 指南
    • Spring Cloud
    • Nacos
    • Docker
    • ElasticSearch
    • Kotlin中文版
    • Kotlin易百
    • KotlinWeb3
    • KotlinNhooo
    • 前端开源搜索
    • Ktorm ORM
    • Ktorm-KSP
    • Ebean ORM
    • Maven
    • 江南一点雨
    • 江南国际站
    • 设计模式
    • 熊猫大佬
    • java学习
    • kotlin函数查询
    • Istio 服务网格
    • istio
    • Ktor 异步 Web 框架
    • PostGis
    • kuangstudy
    • 源码地图
    • it教程吧
    • Arthas-JVM调优
    • Electron
    • bugstack虫洞栈
    • github大佬宝典
    • Sa-Token
    • 前端技术胖
    • bennyhuo-Kt大佬
    • Rickiyang博客
    • 李大辉大佬博客
    • KOIN
    • SQLDelight
    • Exposed-Kt-ORM
    • Javalin—Web 框架
    • http4k—HTTP包
    • 爱威尔大佬
    • 小土豆
    • 小胖哥安全框架
    • 负雪明烛刷题
    • Kotlin-FP-Arrow
    • Lua参考手册
    • 美团文章
    • Java 全栈知识体系
    • 尼恩架构师学习
    • 现代 JavaScript 教程
    • GO相关文档
    • Go学习导航
    • GoCN社区
    • GO极客兔兔-案例
    • 讯飞星火GPT
    • Hollis博客
    • PostgreSQL德哥
    • 优质博客推荐
    • 半兽人大佬
    • 系列教程
    • PostgreSQL文章
    • 云原生资料库
    • 并发博客大佬
Help?

Please contact us on our email for need any support

Support
    首页   ›   Java   ›   Java Notes   ›   正文
Java Notes

Java —最常用的工具类

2020-09-07 13:11:17
797  0 0
参考目录 隐藏
1) 1、IOUtils
2) 2、FileUtils
3) 3、StringUtils
4) 4、FilenameUtils
5) 5、ArrayUtils
6) 6、DigestUtils
7) 7、StringEscapeUtils
8) 8、BeanUtils
9) 9、Collections

阅读完需:约 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中
 *
 */

如本文“对您有用”,欢迎随意打赏作者,让我们坚持创作!

0 打赏
Enamiĝu al vi
不要为明天忧虑.因为明天自有明天的忧虑.一天的难处一天当就够了。
543文章 68评论 294点赞 593823浏览

随机文章
Git分支管理—4
5年前
SpringBoot—运行原理探究
5年前
Kotlin-协程(专)—序列生成器(三十八)
4年前
Kotlin-内置类型—函数(六)
4年前
SpringBoot—自动配置原理
5年前
博客统计
  • 日志总数:543 篇
  • 评论数目:68 条
  • 建站日期:2020-03-06
  • 运行天数:1927 天
  • 标签总数:23 个
  • 最后更新:2024-12-20
Copyright © 2025 网站备案号: 浙ICP备20017730号 身体没有灵魂是死的,信心没有行为也是死的。
主页
页面
  • 归档
  • 摘要
  • 杂图
  • 问题随笔
博主
Enamiĝu al vi
Enamiĝu al vi 管理员
To be, or not to be
543 文章 68 评论 593823 浏览
测试
测试
看板娘
赞赏作者

请通过微信、支付宝 APP 扫一扫

感谢您对作者的支持!

 支付宝 微信支付