字符串工具-StrUtil
- hasBlank、hasEmpty方法
这两个方法的区别是hasEmpty只判断是否为null或者空字符串(“”),hasBlank则会把不可见字符也算做空,isEmpty和isBlank同理。
- removePrefix、removeSuffix方法
这两个是去掉字符串的前缀后缀的,例如去个文件名的扩展名啥。
String fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg") //fileName -> pretty_girl
还有忽略大小写的removePrefixIgnoreCase和removeSuffixIgnoreCase都比较实用。
- 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
- str、bytes方法
原生的String.getByte()这个方法太坑了,使用系统编码,经常会有人跳进来导致乱码问题,所以我就加了这两个方法强制指定字符集了,包了个try抛出一个运行时异常,省的我得在我业务代码里处理那个恶心的UnsupportedEncodingException。
- format方法
这貌似就是打印日志的~~~
String template = "{}爱{},就像老鼠爱大米";
String str = StrUtil.format(template, "我", "你"); //str -> 我爱你,就像老鼠爱大米
- 定义的一些常量
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进制数字)。
-
EscapeUtil.escape Escape编码(Unicode),该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。
-
EscapeUtil.unescape Escape解码。
-
EscapeUtil.safeUnescape 安全的unescape文本,当文本不是被escape的时候,返回原文。
Hash算法-HashUtil
URL工具-URLUtil
- 获取URL对象
URL url = URLUtil.url("");
URL url1 = URLUtil.getURL("");
- 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());
- ObjectUtil.equal
- ObjectUtil.length
CharSequence
Collection
Map
Iterator
Enumeration
Array
- ObjectUtil.contains
String
Collection
Map
Iterator
Enumeration
Array
- 判断是否为null
ObjectUtil.isNull
ObjectUtil.isNotNull - 克隆
ObjectUtil.clone 克隆对象,如果对象实现Cloneable接口,调用其clone方法,如果实现Serializable接口,执行深度克隆,否则返回null。 - 序列化和反序列化
serialize 序列化,调用JDK序列化
deserialize 反序列化,调用JDK - 判断基本类型
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
生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组。