hutool 解读(四)——工具类

字符串工具-StrUtil

  1. hasBlank、hasEmpty方法

这两个方法的区别是hasEmpty只判断是否为null或者空字符串(“”),hasBlank则会把不可见字符也算做空,isEmpty和isBlank同理。

  1. removePrefix、removeSuffix方法

这两个是去掉字符串的前缀后缀的,例如去个文件名的扩展名啥。

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

还有忽略大小写的removePrefixIgnoreCase和removeSuffixIgnoreCase都比较实用。

  1. sub方法
String str = "abcdefgh";
String strSub1 = StrUtil.sub(str, 2, 3); //strSub1 -> c
// 支持复数
String strSub2 = StrUtil.sub(str, 2, -3); //strSub2 -> cde
//自动修正
String strSub3 = StrUtil.sub(str, 3, 2); //strSub2 -> c
  1. str、bytes方法

原生的String.getByte()这个方法太坑了,使用系统编码,经常会有人跳进来导致乱码问题,所以我就加了这两个方法强制指定字符集了,包了个try抛出一个运行时异常,省的我得在我业务代码里处理那个恶心的UnsupportedEncodingException。

  1. format方法

这貌似就是打印日志的~~~

String template = "{}爱{},就像老鼠爱大米";
String str = StrUtil.format(template, "我", "你"); //str -> 我爱你,就像老鼠爱大米
  1. 定义的一些常量

16进制工具-HexUtil

16进制一般针对无法显示的一些二进制进行显示,常用于: 1、图片的字符串表现形式 2、加密解密 3、编码转换

String str = "我是一个字符串";

String hex = HexUtil.encodeHexStr(str, CharsetUtil.CHARSET_UTF_8);

//hex是:
//e68891e698afe4b880e4b8aae5ad97e7aca6e4b8b2

String decodedStr = HexUtil.decodeHexStr(hex);

//解码后与str相同

Escape工具-EscapeUtil

转义和反转义工具类Escape / Unescape。escape采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。

  1. EscapeUtil.escape Escape编码(Unicode),该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。

  2. EscapeUtil.unescape Escape解码。

  3. EscapeUtil.safeUnescape 安全的unescape文本,当文本不是被escape的时候,返回原文。

Hash算法-HashUtil

在这里插入图片描述

URL工具-URLUtil

  1. 获取URL对象
URL url = URLUtil.url("");
URL url1 = URLUtil.getURL("");
  1. URLUtil.normalize 标准化化URL链接。

对于不带http://头的地址做简单补全。

String url = "http://www.hutool.cn//aaa/bbb";
// 结果为:http://www.hutool.cn/aaa/bbb
String normalize = URLUtil.normalize(url);

url = "http://www.hutool.cn//aaa/\\bbb?a=1&b=2";
// 结果为:http://www.hutool.cn/aaa/bbb?a=1&b=2
normalize = URLUtil.normalize(url);
  • URLUtil.encode

封装URLEncoder.encode,将需要转换的内容(ASCII码形式之外的内容),用十六进制表示法转换出来,并在之前加上%开头。

String body = "366466 - 副本.jpg";
// 结果为:366466%20-%20%E5%89%AF%E6%9C%AC.jpg
String encode = URLUtil.encode(body);
  • URLUtil.decode 封装URLDecoder.decode,将%开头的16进制表示的内容解码。
  • URLUtil.getPath 获得path部分 URI -> http://www.aaa.bbb/search?scope=ccc&q=ddd PATH -> /search
  • URLUtil.toURI 转URL或URL字符串为URI。

XML工具-XmlUtil

读取XML

XmlUtil.readXML 读取XML文件
XmlUtil.parseXml 解析XML字符串为Document对象

写XML

XmlUtil.toStr 将XML文档转换为String
XmlUtil.toFile 将XML文档写入到文件

创建XML

XmlUtil.createXml 创建XML文档, 创建的XML默认是utf8编码,修改编码的过程是在toStr和toFile方法里,既XML在转为文本的时候才定义编码

XML操作

通过以下工具方法,可以完成基本的节点读取操作。

  • XmlUtil.cleanInvalid 除XML文本中的无效字符
  • XmlUtil.getElements 根据节点名获得子节点列表
  • XmlUtil.getElement 根据节点名获得第一个子节点
  • XmlUtil.elementText 根据节点名获得第一个子节点
  • XmlUtil.transElements 将NodeList转换为Element列表

XML与对象转换

  • writeObjectAsXml 将可序列化的对象转换为XML写入文件,已经存在的文件将被覆盖。
  • readObjectFromXml 从XML中读取对象。

注意 这两个方法严重依赖JDK的XMLEncoder和XMLDecoder,生成和解析必须成对存在(遵循固定格式),普通的XML转Bean会报错。

Xpath操作

链接

总结

XmlUtil只是w3c dom的简单工具化封装,减少操作dom的难度,如果项目对XML依赖较大,依旧推荐Dom4j框架。

对象工具-ObjectUtil

final String dateStr = null;

// 此处判断如果dateStr为null,则调用`Instant.now()`,不为null则执行`DateUtil.parse`
Instant result1 = ObjectUtil.defaultIfNull(dateStr,
        () -> DateUtil.parse(dateStr, DatePattern.NORM_DATETIME_PATTERN).toInstant(), Instant.now());
  1. ObjectUtil.equal
  2. ObjectUtil.length

CharSequence
Collection
Map
Iterator
Enumeration
Array

  1. ObjectUtil.contains

String
Collection
Map
Iterator
Enumeration
Array

  1. 判断是否为null
    ObjectUtil.isNull
    ObjectUtil.isNotNull
  2. 克隆
    ObjectUtil.clone 克隆对象,如果对象实现Cloneable接口,调用其clone方法,如果实现Serializable接口,执行深度克隆,否则返回null。
  3. 序列化和反序列化
    serialize 序列化,调用JDK序列化
    deserialize 反序列化,调用JDK
  4. 判断基本类型
    ObjectUtil.isBasicType 判断是否为基本类型,包括包装类型和原始类型。

反射工具-ReflectUtil

Java的反射机制,可以让语言变得更加灵活,对对象的操作也更加“动态”,因此在某些情况下,反射可以做到事半功倍的效果。Hutool针对Java的反射机制做了工具化封装,封装包括:

  • 获取构造方法
  • 获取字段
  • 获取字段值
  • 获取方法
  • 执行方法(对象方法和静态方法)

获取某个类的所有方法

Method[] methods = ReflectUtil.getMethods(ExamInfoDict.class);

获取某个类的指定方法

Method method = ReflectUtil.getMethod(ExamInfoDict.class, "getId");

构造对象

ReflectUtil.newInstance(ExamInfoDict.class);

执行方法

class TestClass {
    private int a;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
}
TestClass testClass = new TestClass();
ReflectUtil.invoke(testClass, "setA", 10);

泛型类型工具-TypeUtil

针对 java.lang.reflect.Type 的工具类封装,最主要功能包括:

  • 获取方法的参数和返回值类型(包括Type和Class)
  • 获取泛型参数类型(包括对象的泛型参数或集合元素的泛型类型)

分页工具-PageUtil

分页工具类并不是数据库分页的封装,而是分页方式的转换。在我们手动分页的时候,常常使用页码+每页个数的方式,但是有些数据库需要使用开始位置和结束位置来表示。很多时候这种转换容易出错(边界问题),于是封装了PageUtil工具类。

transToStartEnd

将页数和每页条目数转换为开始位置和结束位置。 此方法用于不包括结束位置的分页方法。

  • transToStartEnd
    将页数和每页条目数转换为开始位置和结束位置。 此方法用于不包括结束位置的分页方法。
 int[] startEnd1 = PageUtil.transToStartEnd(0, 10);//[0, 10]
 int[] startEnd2 = PageUtil.transToStartEnd(1, 10);//[10, 20]

方法中,页码从0开始,位置从0开始

totalPage

根据总数计算总页数

int totalPage = PageUtil.totalPage(20, 3);//7

分页彩虹算法

//参数意义分别为:当前页、总页数、每屏展示的页数
int[] rainbow = PageUtil.rainbow(5, 20, 6);
//结果:[3, 4, 5, 6, 7, 8]

枚举工具-EnumUtil

//定义枚举
public enum TestEnum{
    TEST1("type1"), TEST2("type2"), TEST3("type3");
    
    private TestEnum(String type) {
        this.type = type;
    }
    
    private String type;
    
    public String getType() {
        return this.type;
    }
}

getNames

//定义枚举
public enum TestEnum {
    TEST1, TEST2, TEST3;
}

List<String> names = EnumUtil.getNames(TestEnum.class);
//结果:[TEST1, TEST2, TEST3]

getFieldValues

List<Object> types = EnumUtil.getFieldValues(TestEnum.class, "type");
//结果:[type1, type2, type3]

getEnumMap

Map<String, Object> enumMap = EnumUtil.getNameFieldMap(TestEnum.class, "type");
enumMap.get("TEST1") // 结果为:type1

getNameFieldMap

Map<String, Object> enumMap = EnumUtil.getNameFieldMap(TestEnum.class, "type");
enumMap.get("TEST1") // 结果为:type1

命令行工具-RuntimeUtil

String str = RuntimeUtil.execForStr("ipconfig");

数字工具-NumberUtil

随机数

NumberUtil.generateRandomNumber(begin,end,size)
生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组。
NumberUtil.generateBySet 
生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组。
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值