千家信息网

Hutool工具包含哪些组件

发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,本篇内容主要讲解"Hutool工具包含哪些组件",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hutool工具包含哪些组件"吧!简介Hutool是一个小而全
千家信息网最后更新 2024年11月22日Hutool工具包含哪些组件

本篇内容主要讲解"Hutool工具包含哪些组件",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Hutool工具包含哪些组件"吧!

简介

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的"。

Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;

Hutool是项目中"util"包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。

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

Hutool如何改变我们的coding方式
Hutool的目标是使用一个工具方法代替一段复杂代码,从而最大限度的避免"复制粘贴"代码的问题,彻底改变我们写代码的方式。

以计算MD5为例:

【以前】打开搜索引擎 -> 搜"Java MD5加密" -> 打开某篇博客-> 复制粘贴 -> 改改好用
【现在】引入Hutool -> SecureUtil.md5()
Hutool的存在就是为了减少代码搜索成本,避免网络上参差不齐的代码出现导致的bug。

包含组件

一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:

模块介绍
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封装

Maven
在项目的pom.xml的dependencies中加入以下内容:

    cn.hutool    hutool-all    5.5.2

痛点

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

Convert类

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

Java常见类型转换

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 a = "2017-05-06";Date value = Convert.toDate(a);

4.转换为集合

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

其它类型转换

1.标准类型
通过Convert.convert(Class, Object)方法可以将任意类型转换为指定类型,Hutool中预定义了许多类型转换,例如转换为URI、URL、Calendar等等,这些类型的转换都依托于ConverterRegistry类。通过这个类和Converter接口,我们可以自定义一些类型转换。详细的使用请参阅"自定义类型转换"一节。

2.泛型类型
通过convert(TypeReference reference, Object value)方法,自行new一个TypeReference对象可以对嵌套泛型进行类型转换。例如,我们想转换一个对象为List类型,此时传入的标准Class就无法满足要求,此时我们可以这样:

Object[] a = { "a", "你", "好", "", 1 };List list = Convert.convert(new TypeReference>() {}, a);

通过TypeReference实例化后制定泛型类型,即可转换对象为我们想要的目标类型。

16进制(Hex)

在很多加密解密,以及中文字符串传输(比如表单提交)的时候,会用到16进制转换,就是Hex转换,为此Hutool中专门封装了HexUtil工具类,考虑到16进制转换也是转换的一部分,因此将其方法也放在Convert类中,便于理解和查找,使用同样非常简单:

转为16进制(Hex)字符串

String a = "我是一个小小的可爱的字符串";//结果:"e68891e698afe4b880e4b8aae5b08fe5b08fe79a84e58fafe788b1e79a84e5ad97e7aca6e4b8b2"String hex = Convert.toHex(a, CharsetUtil.CHARSET_UTF_8);

将16进制(Hex)字符串转为普通字符串:

String hex = "e68891e698afe4b880e4b8aae5b08fe5b08fe79a84e58fafe788b1e79a84e5ad97e7aca6e4b8b2";//结果为:"我是一个小小的可爱的字符串"String raw = Convert.hexStrToStr(hex, CharsetUtil.CHARSET_UTF_8);//注意:在4.1.11之后hexStrToStr将改名为hexToStrString raw = Convert.hexToStr(hex, CharsetUtil.CHARSET_UTF_8);

因为字符串牵涉到编码问题,因此必须传入编码对象,此处使用UTF-8编码。 toHex方法同样支持传入byte[],同样也可以使用hexToBytes方法将16进制转为byte[]

Unicode和字符串转换

与16进制类似,Convert类同样可以在字符串和Unicode之间轻松转换:

String a = "我是一个小小的可爱的字符串";//结果为:"\\u6211\\u662f\\u4e00\\u4e2a\\u5c0f\\u5c0f\\u7684\\u53ef\\u7231\\u7684\\u5b57\\u7b26\\u4e32"    String unicode = Convert.strToUnicode(a);//结果为:"我是一个小小的可爱的字符串"String raw = Convert.unicodeToStr(unicode);

编码转换

在接收表单的时候,我们常常被中文乱码所困扰,其实大多数原因是使用了不正确的编码方式解码了数据。于是Convert.convertCharset方法便派上用场了,它可以把乱码转为正确的编码方式:

String a = "我不是乱码";//转换后result为乱码String result = Convert.convertCharset(a, CharsetUtil.UTF_8, CharsetUtil.ISO_8859_1);String raw = Convert.convertCharset(result, CharsetUtil.ISO_8859_1, "UTF-8");Assert.assertEquals(raw, a);

注意 经过测试,UTF-8编码后用GBK解码再用GBK编码后用UTF-8解码会存在某些中文转换失败的问题。

时间单位转换

Convert.convertTime方法主要用于转换时长单位,比如一个很大的毫秒,我想获得这个毫秒数对应多少分:

long a = 4535345;//结果为:75long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);

金额大小写转换

面对财务类需求,Convert.digitToChinese将金钱数转换为大写形式:

double a = 67556.32;//结果为:"陆万柒仟伍佰伍拾陆元叁角贰分"String digitUppercase = Convert.digitToChinese(a);

注意 转换为大写只能精确到分(小数点儿后两位),之后的数字会被忽略。

原始类和包装类转换

有的时候,我们需要将包装类和原始类相互转换(比如Integer.class 和 int.class),这时候我们可以:

//去包装Class wrapClass = Integer.class;//结果为:int.classClass unWraped = Convert.unWrap(wrapClass);//包装Class primitiveClass = long.class;//结果为:Long.classClass wraped = Convert.wrap(primitiveClass);

格式化为字符串

调用toString()方法即可返回格式为yyyy-MM-dd HH:mm:ss的字符串,调用toString(String format)可以返回指定格式的字符串。

DateTime dateTime = new DateTime("2017-01-05 12:34:23", DatePattern.NORM_DATETIME_FORMAT);//结果:2017-01-05 12:34:23String dateStr = dateTime.toString();//结果:2017/01/05

LocalDateTime工具-LocalDateTimeUtil

使用

日期转换

String dateStr = "2020-01-23T12:23:56";DateTime dt = DateUtil.parse(dateStr);// Date对象转换为LocalDateTimeLocalDateTime of = LocalDateTimeUtil.of(dt);// 时间戳转换为LocalDateTimeof = LocalDateTimeUtil.ofUTC(dt.getTime());

日期字符串解析

// 解析ISO时间LocalDateTime localDateTime = LocalDateTimeUtil.parse("2020-01-23T12:23:56");// 解析自定义格式时间localDateTime = LocalDateTimeUtil.parse("2020-01-23", DatePattern.NORM_DATE_PATTERN);

解析同样支持LocalDate:

LocalDate localDate = LocalDateTimeUtil.parseDate("2020-01-23");// 解析日期时间为LocalDate,时间部分舍弃localDate = LocalDateTimeUtil.parseDate("2020-01-23T12:23:56", DateTimeFormatter.ISO_DATE_TIME);

日期格式化

LocalDateTime localDateTime = LocalDateTimeUtil.parse("2020-01-23T12:23:56");// "2020-01-23 12:23:56"String format = LocalDateTimeUtil.format(localDateTime, DatePattern.NORM_DATETIME_PATTERN);

日期偏移

final LocalDateTime localDateTime = LocalDateTimeUtil.parse("2020-01-23T12:23:56");// 增加一天// "2020-01-24T12:23:56"LocalDateTime offset = LocalDateTimeUtil.offset(localDateTime, 1, ChronoUnit.DAYS);

如果是减少时间,offset第二个参数传负数即可:

// "2020-01-22T12:23:56"offset = LocalDateTimeUtil.offset(localDateTime, -1, ChronoUnit.DAYS);

日期偏移

LocalDateTime start = LocalDateTimeUtil.parse("2019-02-02T00:00:00");LocalDateTime end = LocalDateTimeUtil.parse("2020-02-02T00:00:00");Duration between = LocalDateTimeUtil.between(start, end);// 365between.toDays();

一天的开始和结束

LocalDateTime localDateTime = LocalDateTimeUtil.parse("2020-01-23T12:23:56");// "2020-01-23T00:00"LocalDateTime beginOfDay = LocalDateTimeUtil.beginOfDay(localDateTime);// "2020-01-23T23:59:59.999999999"LocalDateTime endOfDay = LocalDateTimeUtil.endOfDay(localDateTime);

字符串工具-StrUtil

1.removePrefix、removeSuffix方法
这两个是去掉字符串的前缀后缀的,例如去个文件名的扩展名啥。

String fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg")  //fileName -> pretty_girl

还有忽略大小写的removePrefixIgnoreCase和removeSuffixIgnoreCase都比较实用。
2. sub方法
不得不提一下这个方法,有人说String有了subString你还写它干啥,我想说subString方法越界啥的都会报异常,你还得自己判断,难受死了,我把各种情况判断都加进来了,而且index的位置还支持负数哦,-1表示最后一个字符(这个思想来自于Python,如果学过Python的应该会很喜欢的),还有就是如果不小心把第一个位置和第二个位置搞反了,也会自动修正(例如想截取第4个和第2个字符之间的部分也是可以的哦~) 举个栗子

String str = "abcdefgh";String strSub1 = StrUtil.sub(str, 2, 3); //strSub1 -> cString strSub2 = StrUtil.sub(str, 2, -3); //strSub2 -> cdeString strSub3 = StrUtil.sub(str, 3, 2); //strSub2 -> c

3.format方法

String template = "{}爱{},就像老鼠爱大米";String str = StrUtil.format(template, "我", "你"); //str -> 我爱你,就像老鼠爱大米

参数我定义成了Object类型,如果传别的类型的也可以,会自动调用toString()方法的。

Digester

以MD5为例:

Digester md5 = new Digester(DigestAlgorithm.MD5);// 5393554e94bf0eb6436f240a4fd71282String digestHex = md5.digestHex(testStr);

当然,做为最为常用的方法,MD5等方法被封装为工具方法在DigestUtil中,以上代码可以进一步简化为:

// 5393554e94bf0eb6436f240a4fd71282String md5Hex1 = DigestUtil.md5Hex(testStr);

Hutool-http

最简单的使用莫过于用HttpUtil工具类快速请求某个页面:

//GET请求String content = HttpUtil.get(url);

一行代码即可搞定,当然Post请求也很简单:

//POST请求HashMap paramMap = new HashMap<>();paramMap.put("city", "北京");String result1 = HttpUtil.post(url, paramMap);

Post请求只需使用Map预先制定form表单项即可。

到此,相信大家对"Hutool工具包含哪些组件"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

方法 类型 字符 字符串 封装 工具 结果 代码 日期 时间 编码 参数 进制 对象 项目 组件 格式 问题 开发 支持 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 怎么应对网络安全风险 应用服务器和数据库服务器资源 打电话为什么会服务器繁忙 网络安全硕士点非一级 山东2022春考技能网络技术类 河北大学往年数据库技术试题 护苗.网络安全课 课件 计算机网络技术毕业求职信 数据库的text大小 qt适合什么软件开发 浙江服务器阵列卡配置虚拟主机 数据库构成元素 服务器电脑能带几个显示器 dblink连接多个数据库 创办软件开发公司 php数据库怎么创建表格 服务器自检蓝屏关机 华为网络技术工程师中东 免费服务器文件管理系统 海安鸦退网络技术有限公司 快速制作数据库软件 网络安全运维管理工作记录 为什么数据库加载不了 广州微信软件开发服务费 突然断电了大型服务器怎么办 图文处理用服务器 南充网络安全服务厂家 作业帮网络安全公益讲座观后感 数据库select语句加索引 安徽服务器迁移推荐云主机
0