首页 > 编程语言 >【Java猿猿必备】Hutool工具库开箱即用

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

时间:2024-11-05 17:47:09浏览次数:4  
标签:加密 Hutool 封装 hutool 开箱 Java HttpUtil SecureUtil

        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);//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 [email protected]
# 用户名,默认为发件人邮箱前缀
user = hutool
# 密码(注意,某些邮箱需要为SMTP服务单独设置授权码,详情查看相关帮助)
pass = q1w2e3

发送邮件非常简单:

MailUtil.send("[email protected]", "测试", "邮件测试", false);

还支持群发: 

//支持群发:
ArrayList<String> tos = CollUtil.newArrayList(
    "[email protected]", 
    "[email protected]", 
    "[email protected]", 
    "[email protected]" );
MailUtil.send(tos, "测试", "邮件群发测试", false);
//支持添加一个或者多个附件:
MailUtil.send("[email protected]", "测试", "<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(){
    
    @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工具类用于快速实现加密。

方法介绍

  • 加密解密

  • 加密分为三种:

  • 对称加密(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 

 

标签:加密,Hutool,封装,hutool,开箱,Java,HttpUtil,SecureUtil
From: https://blog.csdn.net/longxiaotian718/article/details/143516061

相关文章

  • Java入门十二——static详解(含toString)
    上节课,我们只是微微提到了static,今天我们来具体讲讲static的用法static1.类名.静态成员变量(上篇博客Java入门十一有讲)为了方便大家查看,我把链接放在这里Java入门11——关键字总结+static-CSDN博客2.类名.静态成员方法这里,我们首先创建两个类,分别是java12和demo1,然后调用d......
  • 什么是java序列化?什么情况下需要序列化?
      序列化的定义Java序列化是为了保存各种对象在内存中的状态,并且可以把保存的对象状态再读出来。序列化是一种用于处理对象流的机制,它将对象的内容转换成一种可以在网络之间传输的形式。反序列化则是将这种形式的对象恢复成原来的对象。实现方式序列化是通过实现​​Seri......
  • 什么是java序列化?什么情况下需要序列化?
      序列化的定义Java序列化是为了保存各种对象在内存中的状态,并且可以把保存的对象状态再读出来。序列化是一种用于处理对象流的机制,它将对象的内容转换成一种可以在网络之间传输的形式。反序列化则是将这种形式的对象恢复成原来的对象。实现方式序列化是通过实现​​Seri......
  • 黑马程序员JavaWeb开发教程(后端部分---原理篇) ---笔记分享
    目录SpingBoot原理配置优先级Bean管理获取BeanBean作用域第三方BeanSpringBoot原理起步依赖自动配置自动配置原理原理分析要搞清楚SpringBoot的自动配置原理,要从SpringBoot启动类上使用的核心注解@SpringBootApplication开始分析:@SpringBootConfiguration注解上使......
  • Java第八天(实训学习整理资料(七)练习题)
    练习:1、输入一个字符串和一个数字,数字表示字节个数,然后按照指定的字节个数来截取这个字符串,要求不准出现半个字符的现象2、输入一个字符串,提取这个字符串中的数字并求和->sdf85dfghd72s6->85726->283、输入一个字符串,提取这个字符串中的数字并排序->sdf85dfghd72......
  • JavaOOP01——对象定义
    目录一、 面向对象概念二、面向对象程序设计步骤三、封装步骤 四、构造方法及重载 五、this()形成构造函数链 六、基本数据类型与包装类 七、Integer 类基本介绍一、 面向对象概念 面向对象编程(Object-OrientedProgramming,OOP)是一种编程范式,它使用“对象......
  • 关于idea连接数据库时报错:Cannot run program E:\IntelliJ_IDEA_2023.3.4\jbr\bin
    问题说明连接mysql数据库时在点击testconnection时弹出的问题:CannotrunprogramE:\IntelliJ_IDEA_2023.3.4\jbr\bin\javacreateprocesserror=5,拒绝访问查询多个网站都没有找到解决方案。解决方法点击左侧Drivers,找到MySQL右侧点击Advanced在最下方的VMhome......
  • java计算机毕业设计基于springboot的游戏交易网络无忧(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着游戏产业的迅猛发展,游戏交易市场日益庞大。然而,当前的游戏交易环境面临着诸多挑战。一方面,游戏交易涉及到众多参与者,包括普通用户和卖家用户......
  • java计算机毕业设计基于java的学生宿舍管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着教育事业的不断发展,学校规模逐渐扩大,学生人数日益增多,学生宿舍管理工作变得愈发复杂和繁琐。传统的学生宿舍管理方式主要依赖手工记录和人工......