这两个方法的区别是hasEmpty只判断是否为null或者空字符串(""),hasBlank则会把不可见字符也算做空,isEmpty和isBlank同理。
这两个是去掉字符串的前缀后缀的,例如去个文件名的扩展名啥。
String fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg") //fileName -> pretty_girl
还有忽略大小写的removePrefixIgnoreCase和removeSuffixIgnoreCase都比较实用。
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
原生的String.getByte()这个方法太坑了,使用系统编码,经常会有人跳进来导致乱码问题,所以我就加了这两个方法强制指定字符集了,包了个try抛出一个运行时异常,省的我得在我业务代码里处理那个恶心的UnsupportedEncodingException。
这貌似就是打印日志的~~~
String template = "{}爱{},就像老鼠爱大米";
String str = StrUtil.format(template, "我", "你"); //str -> 我爱你,就像老鼠爱大米
16进制一般针对无法显示的一些二进制进行显示,常用于: 1、图片的字符串表现形式 2、加密解密 3、编码转换
String str = "我是一个字符串";
String hex = HexUtil.encodeHexStr(str, CharsetUtil.CHARSET_UTF_8);
//hex是:
//e68891e698afe4b880e4b8aae5ad97e7aca6e4b8b2
String decodedStr = HexUtil.decodeHexStr(hex);
//解码后与str相同
转义和反转义工具类Escape / Unescape。escape采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。
EscapeUtil.escape Escape编码(Unicode),该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。
EscapeUtil.unescape Escape解码。
EscapeUtil.safeUnescape 安全的unescape文本,当文本不是被escape的时候,返回原文。
URL url = URLUtil.url("");
URL url1 = URLUtil.getURL("");
对于不带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);
封装URLEncoder.encode,将需要转换的内容(ASCII码形式之外的内容),用十六进制表示法转换出来,并在之前加上%开头。
String body = "366466 - 副本.jpg";
// 结果为:366466%20-%20%E5%89%AF%E6%9C%AC.jpg
String encode = URLUtil.encode(body);
XmlUtil.readXML 读取XML文件
XmlUtil.parseXml 解析XML字符串为Document对象
XmlUtil.toStr 将XML文档转换为String
XmlUtil.toFile 将XML文档写入到文件
XmlUtil.createXml 创建XML文档, 创建的XML默认是utf8编码,修改编码的过程是在toStr和toFile方法里,既XML在转为文本的时候才定义编码
通过以下工具方法,可以完成基本的节点读取操作。
注意 这两个方法严重依赖JDK的XMLEncoder和XMLDecoder,生成和解析必须成对存在(遵循固定格式),普通的XML转Bean会报错。
链接
XmlUtil只是w3c dom的简单工具化封装,减少操作dom的难度,如果项目对XML依赖较大,依旧推荐Dom4j框架。
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());
CharSequence
Collection
Map
Iterator
Enumeration
Array
String
Collection
Map
Iterator
Enumeration
Array
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);
针对 java.lang.reflect.Type 的工具类封装,最主要功能包括:
分页工具类并不是数据库分页的封装,而是分页方式的转换。在我们手动分页的时候,常常使用页码+每页个数的方式,但是有些数据库需要使用开始位置和结束位置来表示。很多时候这种转换容易出错(边界问题),于是封装了PageUtil工具类。
将页数和每页条目数转换为开始位置和结束位置。 此方法用于不包括结束位置的分页方法。
int[] startEnd1 = PageUtil.transToStartEnd(0, 10);//[0, 10]
int[] startEnd2 = PageUtil.transToStartEnd(1, 10);//[10, 20]
方法中,页码从0开始,位置从0开始
根据总数计算总页数
int totalPage = PageUtil.totalPage(20, 3);//7
//参数意义分别为:当前页、总页数、每屏展示的页数
int[] rainbow = PageUtil.rainbow(5, 20, 6);
//结果:[3, 4, 5, 6, 7, 8]
//定义枚举
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;
}
}
//定义枚举
public enum TestEnum {
TEST1, TEST2, TEST3;
}
List<String> names = EnumUtil.getNames(TestEnum.class);
//结果:[TEST1, TEST2, TEST3]
List<Object> types = EnumUtil.getFieldValues(TestEnum.class, "type");
//结果:[type1, type2, type3]
Map<String, Object> enumMap = EnumUtil.getNameFieldMap(TestEnum.class, "type");
enumMap.get("TEST1") // 结果为:type1
Map<String, Object> enumMap = EnumUtil.getNameFieldMap(TestEnum.class, "type");
enumMap.get("TEST1") // 结果为:type1
String str = RuntimeUtil.execForStr("ipconfig");
NumberUtil.generateRandomNumber(begin,end,size)
生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组。
NumberUtil.generateBySet
生成不重复随机数 根据给定的最小数字和最大数字,以及随机数的个数,产生指定的不重复的数组。