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

【Java猿猿必备】Hutool工具库开箱即用

        Hutool 真心是一个不错的国产 Java 工具类库,功能全面,对文件、流、加密解密、转码、正则、线程、XML 等 JDK 方法进行了封装,开箱即用!深受国内开发者的喜爱。目前确实是成为了国内使用最广的工具库之一了, Gitee 上的 Star 数也到了 23k +。

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

官网:https://hutool.cn/

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);//12double 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.x

 

3、HTTP 请求工具类

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

HttpUtil.getHttpUtil.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(){@Overridepublic void start() {Console.log("开始下载。。。。");}@Overridepublic void progress(long progressSize) {Console.log("已下载:{}", FileUtil.readableFileSize(progressSize));}@Overridepublic 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工具类用于快速实现加密。

方法介绍

  • 加密解密

  • 加密分为三种:

  • 对称加密(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>(){@Overridepublic Boolean call() throws Exception {init(sensitiveWords);return true;}});}else{// 同步初始化敏感词树init(sensitiveWords);}
}

Hutool还有很多功能都非常实用比如字符工具类,jwt工具,时间的封装等.

更多还请查阅官方网文档https://hutool.cn/docs 

 


http://www.mrgr.cn/news/66213.html

相关文章:

  • 大模型微调技术 --> 脉络
  • leetcode-3-无重复字符的最长子串
  • linux重启PHP
  • ARGB和‌RGB的主要区别
  • 24/11/4 算法笔记 蛇形卷积
  • Chromium Mojo(IPC)进程通信演示 c++(1)
  • 数字贸—大势所趋
  • 20241105,LeetCode 每日一题,用 Go 实现两数之和的非暴力解法
  • Java栈和队列的快速入门
  • 【Linux】从零开始使用多路转接IO --- epoll
  • 科研人神器!接入5000万篇正版文献,知乎直答「专业搜索」太能打了
  • 【真题笔记】15年系统架构设计师要点总结
  • 架构师备考-软件工程相关补充
  • Java学习路线:JUL日志系统(一)日志框架介绍
  • 我们这边用java集成Netty服务和充电桩设备通信,现在会频繁出现断连的情况,不知道您这边是否有遇到过?
  • 从最小作用量原理到最优控制理论
  • 鉴源实验室·加密技术在汽车系统中的应用
  • Docker安装XXL-JOB分布式调度任务
  • 盘点 2024 十大免费/开源 WAF
  • Mysql索引-学习笔记
  • 利用递归方法求5!
  • 机器学习与成像技术
  • jmeter结合ansible分布式压测--2jmter环境准备
  • Rust项目结构
  • 深入探讨移动Web开发:从基础到实践
  • 基于Springboot+Vue的在线教育系统 (含源码数据库)