HuTool 使用教程

news2024/12/26 2:16:55

HuTool

  • 官网 Hutool — 🍬A set of tools that keep Java sweet.

一、简介

准备环境
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
Hutool中的工具方法来自于每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。

1. 名称由来

Hutool = Hu + tool,是原公司项目底层代码剥离后的开源库,“Hu”是公司名称的表示,tool表示工具。Hutool谐音“糊涂”,一方面简洁易懂,一方面寓意“难得糊涂”。

2. Hutool如何改变我们的coding方式

Hutool的目标是使用一个工具方法代替一段复杂代码,从而最大限度的避免“复制粘贴”代码的问题,彻底改变我们写代码的方式。
以计算MD5为例:
  • 【以前】打开搜索引擎 -> 搜“Java MD5加密” -> 打开某篇博客-> 复制粘贴 -> 改改好用
  • 【现在】引入Hutool -> SecureUtil.md5()
Hutool的存在就是为了减少代码搜索成本,避免网络上参差不齐的代码出现导致的bug。

二、包含组件

一个Java基础工具类,对 文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装 ,组成各种Util工具类,同时提供以下组件:
模块
介绍
hutool-aop
JDK动态代理封装,提供非IOC下的切面支持
hutool-bloomFilter
布隆过滤,提供一些Hash算法的布隆过滤
hutool-cache
简单缓存实现
hutool-core
核心,包括Bean操作、日期、各种Util等
hutool-cron
定时任务模块,提供类Crontab表达式的定时任务
hutool-crypto
加密解密模块,提供对称、非对称和摘要算法封装
hutool-db
JDBC封装后的数据操作,基于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-json
JSON实现
hutool-captcha
图片验证码实现
hutool-poi
针对POI中Excel和Word的封装
hutool-socket
基于Java的NIO和AIO的Socket封装
注意:可以根据需求对每个模块单独引入,也可以通过引入 hutool-all 方式引入所有模块。

三、使用HuTool

HuTool使用非常简单直接在项目中引入如下依赖即可:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.7</version>
</dependency>

四、Convert类型转换

1. 痛点

在Java开发中我们要面对各种各样的类型转换问题,尤其是从命令行获取的用户参数、从HttpRequest获取的Parameter等等,这些参数类型多种多样,我们怎么去转换他们呢?常用的办法是先整成String,然后调用XXX.parseXXX方法,还要承受转换失败的风险,不得不加一层try catch,这个小小的过程混迹在业务代码中会显得非常难看和臃肿。

2. Convert类

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

3. 如何使用

1. 转换为字符串

int a = 1;
//aStr为"1"
String aStr = Convert.toStr(a);
long[] b = {1,2,3,4,5};
//bStr为:"[1, 2, 3, 4, 5]"
String bStr = Convert.toStr(b);

2. 转换为指定类型数组

String[] b = { "1", "2", "3", "4" };
//结果为Integer数组
Integer[] intArray = Convert.toIntArray(b);
long[] c = {1,2,3,4,5};
//结果为Integer数组
Integer[] intArray2 = Convert.toIntArray(c);

3. 转换为日期对象

String str = "2012-12-12";
Date parse = new SimpleDateFormat("yyyy-MM-dd").parse(str);
Date date = Convert.toDate(str);
System.out.println(date);
String str1 = "2012/12/12";
Date date1 = Convert.toDate(str1);
System.out.println(date1);

4.转换为集合

Object[] a = {"a", "你", "好", "", 1};
List<?> list = Convert.convert(List.class, a);
//从4.1.11开始可以这么用
List<?> list = Convert.toList(a);

五、IO流操作

1.介绍

IO的操作包括 ,应用场景包括网络操作和文件操作。IO操作在Java中是一个较为复杂的过程,我们在面对不同的场景时,要选择不同的 InputStream OutputStream 实现来完成这些操作。而如果想读写字节流,还需要 Reader Writer 的各种实现类。这些繁杂的实现类,一方面给我我们提供了更多的灵活性,另一方面也增加了复杂性。

2.封装

- IoUtil 流操作工具类
- FileUtil 文件读写和操作的工具类。
- FileTypeUtil 文件类型判断工具类
- WatchMonitor 目录、文件监听,封装了JDK1.7中的WatchService
- ClassPathResource针对ClassPath中资源的访问封装
- FileReader 封装文件读取
- FileWriter 封装文件写入

3.IOUtil

# 1.说明
- 主要是用来操作IO流相关的操作
FileInputStream is = new FileInputStream(new File("/Users/chenyannan/IdeaProjects/180codes/HuTool/src/main/resources/aa.txt"));
FileOutputStream os = new FileOutputStream(new File("/Users/chenyannan/IdeaProjects/180codes/HuTool/src/main/resources/cc.txt"));
IoUtil.copy(is,os);
IoUtil.copy(is,os,2048);//指定缓冲区大小
IoUtil.copy(is,os,IoUtil.DEFAULT_BUFFER_SIZE);//指定缓冲区大小

4.FileUtil

//读取文件
FileUtil.file("/Users/chenyannan/IdeaProjects/180codes/HuTool/src/main/resources/bb.txt");
//追加字符串
FileUtil.appendString("我是小陈",file,"UTF-8");
//文件拷贝
FileUtil.copy(file,new File("/Users/chenyannan/IdeaProjects/180codes/HuTool/src/main/resources/bb.txt"),true);
//删除文件
// 需要注意的是,del方法会删除目录而不判断其是否为空,这一方面方便了使用,另一方面也可能造成一些预想不到的后果(比如拼写错路径而删除不应该删除的目录),所以请谨慎使用此方法。
FileUtil.del(file);
File file2 = new File("/Users/chenyannan/IdeaProjects/180codes/HuTool/src/main/resources/aa.txt");
//创建文件同时如果目录不存在也会一并创建
File touch = FileUtil.touch(file2);
//创建多级目录
File mkdir = FileUtil.mkdir(file2);

六、常用工具类

# 1.字符串工具-StrUtil
String str = "aa.txt";
boolean empty = StrUtil.isEmpty(str); //不判断空格
boolean b = StrUtil.isBlank(str); //判断空格
String s = StrUtil.removePrefix(str, "aa");//去掉前缀
String s1 = StrUtil.removeSuffix(str, ".txt");//去掉后缀
String sub = StrUtil.sub(str, 2, str.length());//截取字符串
byte[] bytes = StrUtil.bytes(str, "UTF-8");//指定字符集转为bytes
String tempalte = "姓名:{},年龄:{}";
String content = StrUtil.format(tempalte, "content", 23);
System.out.println(content);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL 注入漏洞攻击

文章目录 1. 介绍2. 无密码登录3. 无用户名无密码登录4. 合并表获取用户名密码 1. 介绍 假设你用自己的用户名和密码登录了一个付费网站&#xff0c;网站服务器就会查询一下你是不是 VIP 用户&#xff0c;而用户数据都是放在数据库中的&#xff0c;服务器通常都会向数据库进行查…

NLP信息抽取全解析:从命名实体到事件的PyTorch实战指南

目录 引言背景和信息抽取的重要性文章的目标和结构 信息抽取概述什么是信息抽取信息抽取的应用场景信息抽取的主要挑战 实体识别什么是实体识别实体识别的应用场景PyTorch实现代码输入、输出与处理过程 关系抽取什么是关系抽取关系抽取的应用场景PyTorch实现代码输入、输出与处…

松下DC-GH6 MOV音频使用可变长且存在00的特殊案例分析

松下mov常见的是GH系列机型&#xff0c;其音频格式一般采用SOWT其实是PCM&#xff0c;只不过一般是一个声道TRAK&#xff08;左右两个声道合成到一个TRAK中&#xff09;。此次遇到的DC-GH6却是一个4声道独立TRAK的松下MOV文件&#xff0c;这种的倒是在索尼上也有遇到过&#xf…

Python(PySpark案例实战)

为什么要学习PySpark&#xff1f; Spark对Python语言的支持&#xff0c;重点体现在&#xff0c;Python第三方库&#xff1a;PySpark之上。 PySpark是由Spark官方开发的Python语言第三方库。 Python开发者可以使用pip程序快速的安装PySpark并像其它三方库那样直接使用。 PySp…

小谈设计模式(1)—总序

小谈设计模式&#xff08;1&#xff09;—总序 开始操作设计模式总论设计模式是什么组成要素模式名称问题描述解决方案效果描述 设计模式有什么作用提供可重用的解决方案提高代码的可读性和可维护性促进代码的可扩展性提高代码的灵活性和可重用性促进团队合作和沟通作用总结 为…

基于SpringBoot的新闻管理系统

基于SpringBoot的新闻管理系统【附源码文档】、前后端分离系统 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 前台 首页新闻信息校园论坛留言交流个人中心 后台 个人中心用…

报错:数组明明有内容但打印的length是0,学会使用 async 和 await 解决问题

文章目录 一、问题二、分析三、解决1.将异步改为同步2.设置延迟 一、问题 在日常开发中&#xff0c;for 循环遍历调用接口&#xff0c;并将接口返回的值进行拼接&#xff0c;即push到一个新的数组中&#xff0c;但是在for循环内部是可以拿到这个新的数组&#xff0c;而for循环…

“投资教父”熊晓鸽老了,IDG光环不再

作者 | 鸠白 艺馨 排版 | Cathy 监制 | Yoda 出品 | 不二研究 2017年&#xff0c;世界互联网大会上&#xff0c;“投资教父”熊晓鸽问映客的创始人&#xff1a;“今年你们利润能有多少&#xff1f;” 对方笑答&#xff1a;“5个亿吧&#xff01;” “才五个亿&#xff1f…

产品MC动画宣传片制作团队安排

在产品MC动画宣传片的制作过程中&#xff0c;通常需要组建一个专业的团队&#xff0c;以确保各个方面的工作能够高效完成。以下是一个常见的产品MC动画宣传片制作团队的安排&#xff1a; 1.制片人&#xff08;Producer&#xff09;&#xff1a;负责项目的整体策划和管理&#…

华为云云耀云服务器L实例评测|有关华为云云耀云服务器L实例你可能不知道的事情

前言 最近华为云推出了华为云云耀云服务器L实例。主打一个轻量级云服务器&#xff0c;即开即用&#xff0c;轻松运维&#xff0c;开启简单上云第一步。具有智能不卡顿&#xff0c;价优随心用&#xff0c;上手更简单&#xff0c;管理特省心。 在推出的第一时间我就买了一台来耍…

H5移动端选择器,layPicker移动端日期选择器,jquery移动端自定义选择器

前言 基于jquery实现的&#xff0c;H5移动端选择器 默认自带日期选择&#xff0c;可自定义选择&#xff0c;和自定义html 效果图 微信模拟版 旧版 使用方式简单 layPicker.init({elem: #year, // 绑定元素options: year, // 设置为日期选择器&#xff08;日期选择器可设…

芯科蓝牙BG27开发笔记2-调试第一个程序

soc-Blinky程序去掉bootloader功能之后就可以下载运行了&#xff0c;但是时不时会在连接的时候死机&#xff0c;进入debug&#xff0c;发现&#xff1a; 查代码&#xff0c;该函数被注册到io stream中&#xff0c;但它是在app.c中调用app_log时实际调用&#xff0c;例如&#x…

bug总结问题集和知识点集

目录 一 bug问题集1. 端口被占用 二 oracle1. oracle查看版本怎么操作2. oracle数据库&#xff1a;参数个数无效![在这里插入图片描述](https://img-blog.csdnimg.cn/6a2eebc164f9406c81525371893bbd11.png) 三 mybatis1. mybatis用注解如何实现模糊查询 四 List1. 如何判断Jav…

Kubernetes 部署发布镜像(cubefile:0.4.0)

目录 实验&#xff1a;部署发布镜像&#xff08;cubefile:0.4.0&#xff09; 需求分析&#xff1a; 1、部署Kubenetes环境&#xff1a; 2、撰写 cubefile-deployment.yaml 文件 代码解释&#xff1a; 遇到的问题&#xff1a; 问题解决 &#xff1a; 3、撰写 cubefile-se…

SSL证书验签时要带www吗?

单域名证书&#xff1a;顶级域名如www.abc.com或abc.com 不管你提交订单的时候填写的域名是带www或不带www的域名&#xff0c;签发的证书均支持www和不带www的域名 单域名证书&#xff1a;子域名如mail.abc.com&#xff0c;签发的证书仅支持mail.abc.com 通配符证书&#xff…

LeetCode 50题:实现Pow(x,n)

题目 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000示例 2&#xff1a; 输入&#xff1a;x 2.10000, n 3 输出&#xff1a;9.26…

你知道SOLIDWORKS焊件类零件有个快速草图建立工具吗?

背景&#xff1a; 焊件是SOLIDWORKS中一个重要的组成模块&#xff0c;通过该模块可以很快的建立起一个庞大的型材结构网络。 但是我们也明白焊件是基于草图的&#xff0c;普通的方式建立复杂的草图是需要较多的精力和时间&#xff0c;本次视频的出发点就是针对此问题给出的一个…

Python网页请求超时如何解决

在进行网络爬虫项目时&#xff0c;我们经常需要发送大量的请求来获取所需的数据。然而&#xff0c;由于网络环境的不稳定性&#xff0c;请求可能会因为超时而失败。请求超时可能导致数据获取不完整&#xff0c;影响爬虫的效率和准确性。此外&#xff0c;频繁的请求超时可能会被…

一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到

网上找了好久没解决 问题代码: 11-Sep-2023 16:47:22.109 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到 11-Sep-2023 16:47:22.109 严重 [RMI TCP…

二叉树题目:二叉树的层平均值

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树的层平均值 出处&#xff1a;637. 二叉树的层平均值 难度 4 级 题目描述 要求 给定一个二叉树的根结点 …