Hutool-工具常用代码集
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
Hutool的目标是使用一个工具方法代替一段复杂代码,从而最大限度的避免“复制粘贴”代码的问题,彻底改变我们写代码的方式。
准备:引入Hutool依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.16</version>
</dependency>
一、类型判断
1.1 判断是否是JSON格式
public static void main(String[] args) {
String data = "{userName:alan,sex:1}";
boolean isJson = JSONUtil.isJson(data);
// true
System.out.println(isJson);
}
1.2 判断是否为Number
public static void main(String[] args) {
String num = "12.3";
boolean isNum = NumberUtil.isNumber(num);
// true
System.out.println(isNum);
}
同理,可以调用相应的方法,判断是否为Double,Integer、Long
// 是否为Double
NumberUtil.isDouble(num);
//是否为Integer
NumberUtil.isInteger(num);
//是否为Long
NumberUtil.isLong(num);
二、BeanUtil
2.1 复制Bean对象属性
1、默认拷贝
BeanUtil.copyProperties(Object source, Object target)
2、当拷贝值为null时,不拷贝
public static void main(String[] args) {
//当拷贝值为null时,不拷贝
CopyOptions copyOptions = new CopyOptions();
copyOptions.setIgnoreNullValue(true);
BeanUtil.copyProperties(null,null,copyOptions);
}
2.2 对象转Map
Map<String, Object> map = BeanUtil.beanToMap(d);
2.3 Map转对象
DynamicDetailEntity entity = BeanUtil.toBean(map, DynamicDetailEntity.class);
三、类型转换工具类-Convert
3.1 转List
3.1.1 String转List
public class Client {
public static void main(String[] args) {
String strs = "a,b,c,d";
List<String> strList = Convert.toList(String.class,strs);
//4
System.out.println(strList.size());
//[a, b, c, d]
System.out.println(strList);
}
}
3.1.2 数组转List
Object[] a = {"a", "你", "好", "", 1};
List<?> list = Convert.convert(List.class, a);
//从4.1.11开始可以这么用
List<?> list = Convert.toList(a);
3.2 转换为字符串
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);
3.3 转换为指定类型数组
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.4 转换为日期对象
String a = "2017-05-06";
Date value = Convert.toDate(a);
3.5 半角和全角转换
String a = "123456789";
//结果为:"123456789"
String sbc = Convert.toSBC(a);
3.6 编码转换
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);
3.7 时间单位转换
long a = 4535345;
//结果为:75分钟
long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);
3.8 金额大小写转换
double a = 67556.32;
//结果为:"陆万柒仟伍佰伍拾陆元叁角贰分"
String digitUppercase = Convert.digitToChinese(a);
注意 转换为大写只能精确到分(小数点儿后两位),之后的数字会被忽略。
3.9 数字转换
3.9.1 数字转为英文表达
// ONE HUNDRED AND CENTS TWENTY THREE ONLY
String format = Convert.numberToWord(100.23);
3.9.2 数字简化
// 1.2k
String format1 = Convert.numberToSimple(1200);
3.9.3 数字中文表示转换为数字
// 1012
int f1 = Convert.chineseToNumber("一千零一十二");
四、统计代码的耗时
常规统计方式
public static void main(String[] args) throws InterruptedException {
final Long start = System.currentTimeMillis();
// 此处以线程睡眠代替执行代码逻辑
Thread.sleep(1000);
final Long end = System.currentTimeMillis();
//代码耗时:1016ms
System.out.println("代码耗时:" + (end - start) + "ms");
}
Hutool统计方式
public static void main(String[] args) throws InterruptedException {
final TimeInterval timer = DateUtil.timer();
// 此处以线程睡眠代替执行代码逻辑
Thread.sleep(1000);
//1001
System.out.println(timer.interval());
//1秒2毫秒
System.out.println(timer.intervalPretty());
}
五、信息脱敏工具-DesensitizedUtil
我们以身份证号码为例:
// 5***************1X
DesensitizedUtil.idCardNum("51343620000320711X", 1, 2);
对于约定俗成的脱敏,我们可以不用指定隐藏位数,比如手机号:
// 180****1999
DesensitizedUtil.mobilePhone("18049531999");
当然还有一些简单粗暴的脱敏,比如密码,只保留了位数信息:
// **********
DesensitizedUtil.password("1234567890");
六、随机工具-RandomUtil
6.1 获得指定范围内的随机数
RandomUtil.randomInt
获得指定范围内的随机数。例如我们想产生一个[10, 100)的随机数,则:
int c = RandomUtil.randomInt(10, 100);
6.2 随机bytes
RandomUtil.randomBytes
随机bytes,一般用于密码或者salt生成
byte[] c = RandomUtil.randomBytes(10);
6.3 随机获得列表中的元素
RandomUtil.randomEle
随机获得列表中的元素。可应用于抽签功能
6.4 随机获得列表中的一定量的不重复元素
RandomUtil.randomEleSet
随机获得列表中的一定量的不重复元素,返回Set
Set<Integer> set = RandomUtil.randomEleSet(CollUtil.newArrayList(1, 2, 3, 4, 5, 6), 2);
6.5 获得一个随机的字符串
RandomUtil.randomString
获得一个随机的字符串(只包含数字和字符)
6.6 获得一个只包含数字的字符串
RandomUtil.randomNumbers
获得一个只包含数字的字符串
6.7 权重随机生成器
RandomUtil.weightRandom
权重随机生成器,传入带权重的对象,然后根据权重随机获取对象。
可应用于抽奖活动,一等奖、二等奖、三等奖 中奖概率不一样
七、SecureUtil加密工具
7.1 sha1签名
String string1="待签名字符串";
String signature = SecureUtil.sha1(string1);
// signature : a9fece7ef7cea1e1415be3c6423fba649a0757fd
八、时间工具类DateUtil
8.1 获取当前时间时间戳
public static void main(String[] args) {
//毫秒:1650432761873
Long timestamp = DateUtil.current();
System.out.println(timestamp);
//秒:1650432761
Long seconds = DateUtil.currentSeconds();
System.out.println(seconds);
}
源码
/**
* 当前时间的时间戳
*
* @return 时间
*/
public static long current() {
return System.currentTimeMillis();
}
九、线程工具-ThreadUtil
9.1 异步执行
-
ThreadUtil.execAsync:执行异步方法
-
ThreadUtil.execute:直接在公共线程池中执行线程
-
ThreadUtil.newExecutor:获得一个新的线程池
-
ThreadUtil.newCompletionService:创建CompletionService,调用其submit方法可以异步执行多个任务,最后调用take方法按照完成的顺序获得其结果。若未完成,则会阻塞。
-
ThreadUtil.newCountDownLatch:新建一个CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
-
ThreadUtil.sleep:挂起当前线程,是Thread.sleep的封装,通过返回boolean值表示是否被打断,而不是抛出异常。
示例代码
public class Client {
public static void main(String[] args) {
final TimeInterval timer = DateUtil.timer();
/**
* 1、执行异步方法
*/
ThreadUtil.execAsync(() -> {
ThreadUtil.sleep(3000);
System.out.println("execAsync");
return true;
});
System.out.println("1、耗时:"+timer.intervalPretty());
/**
* 2、直接在公共线程池中执行线程
*/
ThreadUtil.execute(() -> System.out.println("execute"));
/**
* 3、获得一个新的线程池
*/
ExecutorService executorService = ThreadUtil.newExecutor();
/**
* 4、创建CompletionService,调用其submit方法可以异步执行多个任务,最后调用take方法按照完成的顺序获得其结果。若未完成,则会阻塞。
*/
try {
CompletionService completionService = ThreadUtil.newCompletionService();
Object result = completionService.submit(() -> {
ThreadUtil.sleep(3000);
System.out.println("completionService.submit 1");
return true;
}).get();
Object result2 = completionService.submit(() -> {
System.out.println("completionService.submit 2");
return false;
}).get();
completionService.take();
System.out.println("result = "+result+"; result2 = "+result2);
System.out.println("4、耗时:"+timer.intervalPretty());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("end 4");
/**
* 5、新建一个CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
*/
CountDownLatch countDownLatch = ThreadUtil.newCountDownLatch(2);
}
}
执行结果
1、耗时:45毫秒
execute
completionService.submit 1
execAsync
completionService.submit 2
result = true; result2 = false
4、耗时:3秒59毫秒
end 4
9.2 ConcurrencyTester高并发测试
很多时候,我们需要简单模拟N个线程调用某个业务测试其并发状况,可以可使用ConcurrencyTester
public class Client {
public static void main(String[] args) {
ConcurrencyTester tester = ThreadUtil.concurrencyTest(100, () -> {
//调用逻辑内容
doTest();
});
//获取总的执行时间,单位毫秒
System.out.println("执行总时间:"+tester.getInterval());
}
/**
* 测试的逻辑内容
*/
private static void doTest() {
System.out.println("doTest:"+DateUtil.now());
long delay = RandomUtil.randomLong(100, 1000);
ThreadUtil.sleep(delay);
Console.log("{} test finished, delay: {}", Thread.currentThread().getName(), delay);
}
}
十、EscapeUtil转义和反转义
10.1 转义
public static void main(String[] args) {
String str = EscapeUtil.escape("http://图片.png");
//http%3a//%u56fe%u7247.png
System.out.println(str);
}
10.2 反转义
public static void main(String[] args) {
String str = EscapeUtil.unescape("http%3a//%u56fe%u7247.png");
//http://图片.png
System.out.println(str);
}
十一、URLUtil
11.1 标准化化URL链接
标准化化URL链接。对于不带http://头的地址做简单补全
public static void main(String[] args) {
String url = "www.jianshu.com/图片.png";
String normalize = URLUtil.normalize(url);
//http://www.jianshu.com/
System.out.println(normalize);
}
11.2 转码
public static void main(String[] args) {
String str = URLUtil.encode("http://图片.png");
//http://%E5%9B%BE%E7%89%87.png
System.out.println(str);
}
11.3 解码
public static void main(String[] args) {
String str = URLUtil.decode("http://%E5%9B%BE%E7%89%87.png");
//http://图片.png
System.out.println(str);
}
十二、RuntimeUtil执行cmd、shell命令
在Java世界中,如果想与其它语言打交道,处理调用接口,或者JNI,就是通过本地命令方式调用了。Hutool封装了JDK的Process类,用于执行命令行命令(在Windows下是cmd,在Linux下是shell命令)。
String str = RuntimeUtil.execForStr("ipconfig");
结果
Windows IP 配置
以太网适配器 以太网:
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::xxx:c7a7:xxx:8df8%7
IPv4 地址 . . . . . . . . . . . . : xxx.16.10.25
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : xxx.16.xx.1
无线局域网适配器 本地连接* 1:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
无线局域网适配器 本地连接* 2:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
无线局域网适配器 WLAN:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . : DHCP HOST
以太网适配器 蓝牙网络连接:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
Process finished with exit code 0
十三、IdcardUtil身份证工具
IdcardUtil现在支持大陆15位、18位身份证,港澳台10位身份证。
-
isValidCard 验证身份证是否合法
-
convert15To18 身份证15位转18位
-
getBirthByIdCard 获取生日
-
getAgeByIdCard 获取年龄
-
getYearByIdCard 获取生日年
-
getMonthByIdCard 获取生日月
-
getDayByIdCard 获取生日天
-
getGenderByIdCard 获取性别
-
getProvinceByIdCard 获取省份
十四、MathUtil数学相关
14.1 方法
排列
- arrangementCount 计算排列数
- arrangementSelect 排列选择(从列表中选择n个排列)
组合
- combinationCount 计算组合数,即C(n, m) = n!/((n-m)! * m!)
- combinationSelect 组合选择(从列表中选择n个组合)
14.2 样例-combinationSelect组合选择
public static void main(String[] args) {
String[] data = {"A","B","C","D"};
List<String[]> list = MathUtil.combinationSelect(data,3);
for(String[] itemArry : list){
for(String e : itemArry){
System.out.print(e+" ");
}
System.out.println();
}
}
结果
A B C
A B D
A C D
B C D
Process finished with exit code 0
十五、ImgUtil图片工具
15.1 scale 缩放图片
提供两种重载方法:其中一个是按照长宽缩放,另一种是按照比例缩放。
ImgUtil.scale(
FileUtil.file("d:/face.jpg"),
FileUtil.file("d:/face_result.jpg"),
0.5f//缩放比例
);
15.2 cut 剪裁图片
ImgUtil.cut(
FileUtil.file("d:/face.jpg"),
FileUtil.file("d:/face_result.jpg"),
new Rectangle(200, 200, 100, 100)//裁剪的矩形区域
);
15.3 slice 按照行列剪裁切片(将图片分为20行和20列)
ImgUtil.slice(FileUtil.file("e:/test2.png"), FileUtil.file("e:/dest/"), 10, 10);
15.4 convert 图片类型转换,支持GIF->JPG、GIF->PNG、PNG->JPG、PNG->GIF(X)、BMP->PNG等
ImgUtil.convert(FileUtil.file("e:/test2.png"), FileUtil.file("e:/test2Convert.jpg"));
15.5 gray 彩色转为黑白
ImgUtil.gray(FileUtil.file("d:/logo.png"), FileUtil.file("d:/result.png"));
15.6 pressText 添加文字水印
ImgUtil.pressText(//
FileUtil.file("e:/pic/face.jpg"), //
FileUtil.file("e:/pic/test2_result.png"), //
"版权所有", Color.WHITE, //文字
new Font("黑体", Font.BOLD, 100), //字体
0, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
0, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
0.8f//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
);
15.7 pressImage 添加图片水印
ImgUtil.pressImage(
FileUtil.file("d:/picTest/1.jpg"),
FileUtil.file("d:/picTest/dest.jpg"),
ImgUtil.read(FileUtil.file("d:/picTest/1432613.jpg")), //水印图片
0, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
0, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
0.1f
);
15.8 rotate 旋转图片
// 旋转180度
BufferedImage image = ImgUtil.rotate(ImageIO.read(FileUtil.file("e:/pic/366466.jpg")), 180);
ImgUtil.write(image, FileUtil.file("e:/pic/result.png"));
15.9 flip 水平翻转图片
ImgUtil.flip(FileUtil.file("d:/logo.png"), FileUtil.file("d:/result.png"));
十六、Img图片编辑器
16.1 图像切割
// 将face.jpg切割为原型保存为face_radis.png
Img.from(FileUtil.file("e:/pic/face.jpg"))
.cut(0, 0, 200)//
.write(FileUtil.file("e:/pic/face_radis.png"));
16.2 图片压缩
Img.from(FileUtil.file("e:/pic/1111.png"))
.setQuality(0.8)//压缩比率
.write(FileUtil.file("e:/pic/1111_target.jpg"));
十七、QrCodeUtil二维码工具
17.1 生成二维码
17.1.1 简单样例
// 生成指定url对应的二维码到文件,宽和高都是300像素
QrCodeUtil.generate("https://www.jianshu.com/", 300, 300, FileUtil.file("d:/qrcode.jpg"));
17.1.2 自定义参数
基本参数设定:通过QrConfig可以自定义二维码的生成参数,例如长、宽、二维码的颜色、背景颜色、边距等参数,使用方法如下
QrConfig config = new QrConfig(300, 300);
// 设置边距,既二维码和背景之间的边距
config.setMargin(3);
// 设置前景色,既二维码颜色(青色)
config.setForeColor(Color.CYAN.getRGB());
// 设置背景色(灰色)
config.setBackColor(Color.GRAY.getRGB());
// 生成二维码到文件,也可以到流
QrCodeUtil.generate("https://www.jianshu.com/", config, FileUtil.file("e:/qrcode.jpg"));
附带logo小图标
QrCodeUtil.generate(//
"http://hutool.cn/", //二维码内容
QrConfig.create().setImg("e:/logo_small.jpg"), //附带logo
FileUtil.file("e:/qrcodeWithLogo.jpg")//写出到的文件
);
17.2 识别二维码
// decode -> "https://www.jianshu.com/"
String decode = QrCodeUtil.decode(FileUtil.file("d:/qrcode.jpg"));
十八、EmojiUtil工具
18.1 转义Emoji字符
String alias = EmojiUtil.toAlias("😄");//:smile:
18.2 将转义的别名转为Emoji字符
String emoji = EmojiUtil.toUnicode(":smile:");//😄
18.3 将字符串中的Unicode Emoji字符转换为HTML表现形式
String alias = EmojiUtil.toHtml("😄");//👦
十八、PinyinUtil拼音工具
18.1 引入库
以下为Hutool支持的拼音库的pom坐标,你可以选择任意一个引入项目中,如果引入多个,Hutool会按照以上顺序选择第一个使用。
<dependency>
<groupId>io.github.biezhi</groupId>
<artifactId>TinyPinyin</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.github.stuxuhai</groupId>
<artifactId>jpinyin</artifactId>
<version>1.1.8</version>
</dependency>
18.2 使用
18.2.1 获取拼音
// "ni hao"
String pinyin = PinyinUtil.getPinyin("你好", " ");
这里定义的分隔符为空格,你也可以按照需求自定义分隔符,亦或者使用""无分隔符。
18.2.2
获取拼音首字母
// "h, s, d, y, g"
String result = PinyinUtil.getFirstLetter("H是第一个", ", ");
18.2.3 自定义拼音库(拼音引擎)
Pinyin4jEngine engine = new Pinyin4jEngine();
// "ni hao h"
String pinyin = engine.getPinyin("你好h", " ");
十九、ExpressionUtil表达式工具
19.1 引入库
首先引入我们需要的模板引擎,引入后,Hutool借助SPI机制可自动识别使用,我们以Aviator为例:
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.2.7</version>
</dependency>
19.2 执行表达式
final Dict dict = Dict.create()
.set("a", 100.3)
.set("b", 45)
.set("c", -199.100);
// -143.8
final Object eval = ExpressionUtil.eval("a-(b-c)", dict);
二十、Script工具-ScriptUtil
20.1 执行Javascript脚本
ScriptUtil.eval("print('Script test!');");
20.2 编译脚本
CompiledScript script = ScriptUtil.compile("print('Script test!');");
try {
script.eval();
} catch (ScriptException e) {
throw new ScriptRuntimeException(e);
}
二十一、系统属性调用-SystemUtil
21.1 Java Virtual Machine Specification信息
SystemUtil.getJvmSpecInfo();
结果
JavaVM Spec. Name: Java Virtual Machine Specification
JavaVM Spec. Version: 1.8
JavaVM Spec. Vendor: Oracle Corporation
Process finished with exit code 0
21.2 Java Virtual Machine Implementation信息
SystemUtil.getJvmInfo();
21.3 Java Specification信息
SystemUtil.getJavaSpecInfo();
21.4 系统信息
SystemUtil.getOsInfo();
21.5 当前主机网络地址信息
SystemUtil.getHostInfo();
21.6 运行时信息,包括内存总大小、已用大小、可用大小等
SystemUtil.getRuntimeInfo();
结果
Max Memory: 3.53 GB
Total Memory: 243.5 MB
Free Memory: 233.21 MB
Usable Memory: 3.52 GB
Process finished with exit code 0
二十二、图形验证码Hutool-captcha
//定义图形验证码的长和宽
LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
//图形验证码写出,可以写出到文件,也可以写出到流
lineCaptcha.write("d:/line.png");
//输出code
Console.log(lineCaptcha.getCode());
//验证图形验证码的有效性,返回boolean值
lineCaptcha.verify("1234");
//重新生成验证码
lineCaptcha.createCode();
lineCaptcha.write("d:/line.png");
//新的验证码
Console.log(lineCaptcha.getCode());
//验证图形验证码的有效性,返回boolean值
lineCaptcha.verify("1234");
二十三、CharUtil-字符工具类
//判断是否为emoji表情符
isEmoji(char c)
//是否为Windows或者Linux(Unix)文件分隔符,Windows平台下分隔符为\,Linux(Unix)为/
isFileSeparator(char c)
//判断是否为字母(包括大写字母和小写字母)字母包括A~Z和a~z
isLetter(char ch)
//检查字符是否为小写字母,小写字母指a~z
isLetterLower(char ch)
//判断是否为大写字母,大写字母包括A~Z
isLetterUpper(char ch)
//检查是否为数字字符,数字字符指0~9
isNumber(char ch)
//是否为字母或数字,包括A~Z、a~z、0~9
isLetterOrNumber(char ch)
二十四、ListUtil
24.1 将Map的kyes(Set)转成List
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("A", "a");
map.put("B", "b");
List<String> keyList = ListUtil.toList(map.keySet());
//[A, B]
System.out.println(keyList);
}
二十五、HtmlUtil
针对Http请求中返回的Http内容,Hutool使用此工具类来处理一些HTML页面相关的事情。
HtmlUtil.restoreEscaped 还原被转义的HTML特殊字符
HtmlUtil.encode 转义文本中的HTML字符为安全的字符
HtmlUtil.cleanHtmlTag 清除所有HTML标签
HtmlUtil.removeHtmlTag 清除指定HTML标签和被标签包围的内容
HtmlUtil.unwrapHtmlTag 清除指定HTML标签,不包括内容
HtmlUtil.removeHtmlAttr 去除HTML标签中的属性
HtmlUtil.removeAllHtmlAttr 去除指定标签的所有属性
HtmlUtil.filter 过滤HTML文本,防止XSS攻击
二十六、URL生成器-UrlBuilder
26.1 完整构建
// https://www.hutool.cn/aaa/bbb?ie=UTF-8&wd=test
String buildUrl = UrlBuilder.create()
.setScheme("https")
.setHost("www.hutool.cn")
.addPath("/aaa").addPath("bbb")
.addQuery("ie", "UTF-8")
.addQuery("wd", "test")
.build();
26.2 中文编码
当参数中有中文时,自动编码中文,默认UTF-8编码,也可以调用setCharset方法自定义编码。
// https://www.hutool.cn/s?ie=UTF-8&ie=GBK&wd=%E6%B5%8B%E8%AF%95
String buildUrl = UrlBuilder.create()
.setScheme("https")
.setHost("www.hutool.cn")
.addPath("/s")
.addQuery("ie", "UTF-8")
.addQuery("ie", "GBK")
.addQuery("wd", "测试")
.build();
26.3 解析
当有一个URL字符串时,可以使用of方法解析:
UrlBuilder builder = UrlBuilder.ofHttp("www.hutool.cn/aaa/bbb/?a=张三&b=%e6%9d%8e%e5%9b%9b#frag1", CharsetUtil.CHARSET_UTF_8);
// 输出张三
Console.log(builder.getQuery().get("a"));
// 输出李四
Console.log(builder.getQuery().get("b"));
我们发现这个例子中,原URL中的参数a是没有编码的,b是编码过的,当用户提供此类混合URL时,Hutool可以很好的识别并全部decode,当然,调用build()之后,会全部再encode。
26.4 构建URL
UrlBuilder urlBuilder = UrlBuilder.ofHttp("https://restapi.amap.com/v3/geocode/geo", CharsetUtil.CHARSET_UTF_8);
urlBuilder.addQuery("key", "c7262438248c0c6fdd5d0300");
urlBuilder.addQuery("address", ZhuHai);
String httpUrl = urlBuilder.toString();
String s = HttpUtil.get(httpUrl);
//httpUrl : https://restapi.amap.com/v3/geocode/geo?key=c7262438248d3c0c6fdd80672a5d0300&address=ZhuHai
二十七、StrUtil
27.1 字符串截取
public static void main(String[] args) {
String str = "我人有的和";
String newStr = StrUtil.sub(str,0,2);
String newStr2 = StrUtil.sub(str,0,9);
System.out.println(newStr);
System.out.println(newStr2);
}
结果:
作者:陈琰AC
链接:http://events.jianshu.io/p/ce17f4bed1a1
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。