当前位置: 首页 > article >正文

干掉复杂的工具类,Hutool 工具库确实香!

Hutool 是一个超全的 Java 工具库,深受国内开发者的喜爱。目前确实是成为了国内使用最广的工具库之一了, Gitee 上的 Star 数也到了 23k +。最近新版本有所改动,这里分享一下最新版本的介绍。

一、Hutool简介

Hutool 真心是一个不错的国产 Java 工具类库,功能全面,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行了封装,开箱即用!

官方是这样介绍 Hutool 的:

在这里插入图片描述

Hutool 包含的组件

Hutool 包含的组件以及组件提供的功能如下表所示:

模块介绍
hutool-aopJDK动态代理封装,提供非IOC下的切面支持
hutool-bloomFilter布隆过滤,提供一些Hash算法的布隆过滤
hutool-cache简单缓存实现
hutool-core核心,包括Bean操作、日期、各种Util等
hutool-cron定时任务模块,提供类Crontab表达式的定时任务
hutool-crypto加密解密模块,提供对称、非对称和摘要算法封装
hutool-dbJDBC封装后的数据操作,基于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-jsonJSON实现
hutool-captcha图片验证码实现
hutool-poi针对POI中Excel和Word的封装
hutool-socket基于Java的NIO和AIO的Socket封装
hutool-jwtJSON Web Token (JWT)封装实现

你可以根据项目需求对每个模块单独引入,也可以通过引入hutool-all方式引入所有模块。不过,还是不建议引入所有模块,因为绝大部分功能项目可能都用不上,建议只引入你需要的模块。

另外,Hutool 也有一个比较明显的缺点,很多功能实现的比较简单比如图片验证码、Excel 工具类,很可能无法满足项目的实际需求。像这样情况,还是建议你选择在某一方面更优秀的工具库比如 Excel 工具库 MyExcel、EasyExcel、图片处理库 Imglib

Hutool 实战
Hutool 的官方文档介绍的已经比较清晰了,奈何其提供的功能实在太多,我这里列举一些我个人觉得比较实用的功能,供大家学习参考。

引入依赖
Maven 仓库地址:https://mvnrepository.com/artifact/cn.hutool 。

这里为了方便,我们直接引入所有模块,实际项目中还是建议只引入自己需要的模块。

Maven:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>

Gradle:

implementation 'cn.hutool:hutool-all:5.8.16'

除了这种引入方式之外,目前 Hutool 支持一种更优雅的引入方式,使用hutool-bom模块。

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-bom</artifactId>
                <version>5.8.32</version>
                <type>pom</type>
                <!-- 注意这里是import -->
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-http</artifactId>
        </dependency>
    </dependencies>

二、Hutool功能演示

1、类型转换

Convert类可以说是一个工具方法类,里面封装了针对Java常见类型的转换,用于简化类型转换。Convert类中大部分方法为toXXX,参数为Object,可以实现将任意可能的类型转换为指定类型。同时支持第二个参数defaultValue用于在转换失败时返回一个默认值。

        long[] a = {2,2,4,555,51};
        String aStr = Convert.toStr(a); //[2, 2, 4, 555, 51]

        long b = 12 * 60 * 1000;
        //转换时间单位
        long minutes = Convert.convertTime(b, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);//12

        double c = 123547.32;
        //金额转为中文形式
        String digitUppercase = Convert.digitToChinese(c);//壹拾贰万叁仟伍佰肆拾柒元叁角贰分

2、邮件

在 Java 中发送邮件主要品依靠 javax.mail 包,但是由于使用比较繁琐,因此 Hutool 针对其做了封装。

在 classpath(在标准 Maven 项目中为src/main/resources)的 config 目录下新建mail.setting文件,完整配置如下(邮件服务器必须支持并打开 SMTP 协议):

# 邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
host = smtp.yeah.net
# 邮件服务器的SMTP端口,可选,默认25
port = 25
# 发件人(必须正确,否则发送失败)
from =test1@foxmail.com
# 用户名,默认为发件人邮箱前缀
user = hutool
# 密码(注意,某些邮箱需要为SMTP服务单独设置授权码,详情查看相关帮助)
pass = q1w2e3

发送邮件非常简单:

MailUtil.send("test@foxmail.com", "测试", "邮件测试", false);

支持群发:

ArrayList<String> tos = CollUtil.newArrayList(
    "test1@foxmail.com", 
    "test2@foxmail.com", 
    "test3@foxmail.com", 
    "test4@foxmail.com" );
MailUtil.send(tos, "测试", "邮件群发测试", false);

支持添加一个或者多个附件:

MailUtil.send("test@foxmail.com", "测试", "<h1>邮件测试</h1>", true, FileUtil.file("d:/aaa.xml"));

3、HTTP 请求工具类

针对最为常用的 GET 和 POST 请求,HttpUtil 封装了两个方法,

HttpUtil.get
HttpUtil.post

/ 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS
String result1= HttpUtil.get("https://www.baidu.com");

// 当无法识别页面编码的时候,可以自定义请求页面的编码
String result2= HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);

//可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("city", "北京");

String result3= HttpUtil.get("https://www.baidu.com", paramMap);

POST 请求:



HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("city", "北京");

String result= HttpUtil.post("https://www.baidu.com", paramMap);

文件上传

HashMap<String, Object> paramMap = new HashMap<>();
//文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
paramMap.put("file", FileUtil.file("D:\\face.jpg"));

String result= HttpUtil.post("https://www.baidu.com", paramMap);

下载文件
因为Hutool-http机制问题,请求页面返回结果是一次性解析为byte[]的,如果请求URL返回结果太大(比如文件下载),那内存会爆掉,因此针对文件下载HttpUtil单独做了封装。文件下载在面对大文件时采用流的方式读写,内存中只是保留一定量的缓存,然后分块写入硬盘,因此大文件情况下不会对内存有压力。

String fileUrl = "http://mirrors.sohu.com/centos/8.4.2105/isos/x86_64/CentOS-8.4.2105-x86_64-dvd1.iso";

//将文件下载后保存在E盘,返回结果为下载文件大小
long size = HttpUtil.downloadFile(fileUrl, FileUtil.file("e:/"));
System.out.println("Download size: " + size);

当然,如果我们想感知下载进度,还可以使用另一个重载方法回调感知下载进度:

//带进度显示的文件下载
HttpUtil.downloadFile(fileUrl, FileUtil.file("e:/"), new StreamProgress(){
    
    @Override
    public void start() {
        Console.log("开始下载。。。。");
    }
    
    @Override
    public void progress(long progressSize) {
        Console.log("已下载:{}", FileUtil.readableFileSize(progressSize));
    }
    
    @Override
    public void finish() {
        Console.log("下载完成!");
    }
});

StreamProgress接口实现后可以感知下载过程中的各个阶段。

当然,工具类提供了一个更加抽象的方法:HttpUtil.download,此方法会请求URL,将返回内容写入到指定的OutputStream中。使用这个方法,可以更加灵活的将HTTP内容转换写出,以适应更多场景。

更多有用的工具方法

  • HttpUtil.encodeParams 对URL参数做编码,只编码键和值,提供的值可以是url附带参数,但是不能只是url
  • HttpUtil.toParamsHttpUtil.decodeParams 两个方法是将Map参数转为URL参数字符串和将URL参数字符串转为Map对象
  • HttpUtil.urlWithForm是将URL字符串和Map参数拼接为GET请求所用的完整字符串使用
  • HttpUtil.getMimeType 根据文件扩展名快速获取其MimeType(参数也可以是完整文件路径)

4、缓存

Hutool 提供了常见的几种缓存策略的实现:

  • FIFO(first in first out) :先进先出策略。

  • LFU(least frequently used) :最少使用率策略。

  • LRU(least recently used) :最近最久未使用策略。

  • TimedCache 定时缓存,对被缓存的对象定义一个过期时间,当对象超过过期时间会被清理。此缓存没有容量限制,对象只有在过期后才会被移除

  • WeakCache 弱引用缓存。对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除。该类使用了WeakHashMap做为其实现,缓存的清理依赖于JVM的垃圾回收。

  • FileCach 将小文件以 byte[] 的形式缓存到内容中,减少文件的访问,以解决频繁读取文件引起的性能问题。

5、加密解密

加密分为三种:

  • 对称加密(symmetric),例如:AES、DES等
  • 非对称加密(asymmetric),例如:RSA、DSA等
  • 摘要加密(digest),例如:MD5、SHA-1、SHA-256、HMAC等
    hutool-crypto针对这三种加密类型分别封装,并提供常用的大部分加密算法。
    针对常用到的算法,模块还提供SecureUtil工具类用于快速实现加密。

方法介绍

  • 对称加密
    SecureUtil.aes
    SecureUtil.des
  • 摘要算法
    SecureUtil.md5
    SecureUtil.sha1
    SecureUtil.hmac
    SecureUtil.hmacMd5
    SecureUtil.hmacSha1
  • 非对称加密
    SecureUtil.rsa
    SecureUtil.dsa
    UUID
    SecureUtil.simpleUUID 方法提供无“-”的UUID
  • 密钥生成
    SecureUtil.generateKey 针对对称加密生成密钥
    SecureUtil.generateKeyPair 生成密钥对(用于非对称加密)
    SecureUtil.generateSignature 生成签名(用于非对称加密)

6、线程池

Hutool 支持使用建造者的模式创建自定义线程池,这样看着更加清晰。

private static ExecutorService pool = ExecutorBuilder.create()
              .setCorePoolSize(10)//初始池大小
              .setMaxPoolSize(20) //最大池大小
              .setWorkQueue(new LinkedBlockingQueue<>(100))//最大等待数为100
              .setThreadFactory(ThreadFactoryBuilder.create().setNamePrefix("IM-Pool-").build())// 线程池命名
              .build();

实际项目中,如果一个对象的属性比较多,有限考虑使用建造者模式创建对象。

并且,Hutool 还提供一个全局的线程池,默认所有异步方法在这个线程池中执行。

ThreadUtil.execute : 直接在公共线程池中执行线程
ThreadUtil.execAsync: 执行异步方法

Hutool 自身就大量用到了 ThreadUtil,比如敏感词工具类 SensitiveUtil:


public static void init(final Collection<String> sensitiveWords, boolean isAsync){
  if(isAsync){
    // 异步初始化敏感词树
    ThreadUtil.execAsync(new Callable<Boolean>(){
      @Override
      public Boolean call() throws Exception {
        init(sensitiveWords);
        return true;
      }
      
    });
  }else{
    // 同步初始化敏感词树
    init(sensitiveWords);
  }
}

。。。。。。

Hutool还有很多功能都非常实用比如字符工具类,jwt工具,时间的封装等,更多还请查阅官方网文档
https://hutool.cn/docs

三、相关地址

项目地址:https://github.com/dromara/hutool
官网:https://hutool.cn/


http://www.kler.cn/a/379389.html

相关文章:

  • 学习虚幻C++开发日志——定时器
  • 模型 海勒姆法则(用户依赖你未承诺的API功能)
  • 架构系列---高并发
  • 气象大模型学习笔记
  • 视频去水印怎么办?两种方法教会你
  • 解决wsl重启后debian配置vm.max_map_count不生效问题以及设置docker开机自启
  • Qt中的Model与View(Qt官网翻译版)
  • PH热榜 | 2024-11-04
  • 基于人工智能的搜索和推荐系统
  • 领域(Domain)详解
  • IPC机制总结笔记
  • 关于电脑蓝屏的那些解决方案--总有一款适合你
  • Leetcode 合并两个数组
  • mysql JSON字段使用
  • Gitlab-runner running on Kubernetes - hostAliases
  • 深度学习笔记7-最小二乘法
  • 享元模式-实现大颗粒度对象缓存机制
  • Cesium移动3D模型位置
  • docker desktop使用ubuntu18.04带图形化+运行qemu
  • 划界与分类的艺术:支持向量机(SVM)的深度解析
  • metasploit/modules/evasion 有哪些模块,以及具体使用案例
  • WebService详解
  • 服务器数据恢复—SAN环境中LUN映射错误导致文件系统一致性出错的数据恢复案例
  • 【neo4j】 图数据库neo4j cypher单一语句 optional 可选操作的技巧
  • “代码世界的必修课:Git完整指南“(3)
  • JVM基本结构和垃圾回收机制