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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Hutool-工具常用代码集的更多相关文章

  1. Android基础工具函数代码集

    整理在学习研究Android开发,编写了一些基本用到的工具集,现在整理分享(后续会持续更新,有问题还请指出). 1.HttpClient工具,使用Apache的HttpClient类实现get和pos ...

  2. PHPCMS V9 二次开发常用代码集

    0:调用最新文章,带所在版块 {pc:get sql="SELECT a.title, a.catid, b.catid, b.catname, a.url as turl ,b.url a ...

  3. 【工作常用代码集】批量Telnet远端端口

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ __author__ = 'gnuhpc' import telnetlib,socket IP={} def ...

  4. sqoop 常用命令集

    sqoop是一个介于分布式数据系统与关系型系统之间数据转换的一个数据转换工具 常用命令集sqoop2中sqoop-shell 创建link.job sqoop:001> show link 显示 ...

  5. PyTorch常用代码段整理合集

    PyTorch常用代码段整理合集 转自:知乎 作者:张皓 众所周知,程序猿在写代码时通常会在网上搜索大量资料,其中大部分是代码段.然而,这项工作常常令人心累身疲,耗费大量时间.所以,今天小编转载了知乎 ...

  6. 【转载】GitHub 标星 1.2w+,超全 Python 常用代码合集,值得收藏!

    本文转自逆袭的二胖,作者二胖 今天给大家介绍一个由一个国外小哥用好几年时间维护的 Python 代码合集.简单来说就是,这个程序员小哥在几年前开始保存自己写过的 Python 代码,同时把一些自己比较 ...

  7. git常用代码合集

    git常用代码合集 1. Git init:初始化一个仓库 2. Git add 文件名称:添加文件到Git暂存区 3. Git commit -m “message”:将Git暂存区的代码提交到Gi ...

  8. (转)超全整理!Linux性能分析工具汇总合集

    超全整理!Linux性能分析工具汇总合集 原文:http://rdc.hundsun.com/portal/article/731.html 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望, ...

  9. Mysql 常用命令集

    1.mysqlbinlog工具使用方法如下: 先使用 show binary logs 查看 在使用导出命令 mysqlbinlog -R -uroot -pxxxx -hxxx.xxx.xxx.xx ...

  10. Android 常用代码大集合 [转]

    [Android]调用字符串资源的几种方法   字符串资源的定义 文件路径:res/values/strings.xml 字符串资源定义示例: <?xml version="1.0&q ...

随机推荐

  1. 利用 canvas 实现签名效果

    利用 canvas 实现签名效果 使用插件  jSignature  github:https://github.com/brinley/jSignature 如果再H5 中使用需要加载  flash ...

  2. Mysql高可用架构方案

    目录 Mysql 介绍 高可用结构 主从模式 主从模式介绍 主从复制技术 主从模式注意事项 MHA(MasterHighAvailability) MHA模式介绍 MHA工作流程 MMM(Multi- ...

  3. [ATCoder] Cyclic GCDs - 神圣的数学题

    Cyclic GCDs 题面 [题目描述] 给定一个长为 \(N\) 的序列 \(a_1,a_2,\dots,a_N\). 设一个置换 \(p\) 的价值 \(f(p)\) 为每个轮换中最小的 \(a ...

  4. gearman任务分发改进

    基于我上次在这里发现的问题,就是一次性投递20个消息,用sleep等待后发现,最后一个任务需要等前面19个都跑完才能执行,所以这里做一下改进. client.php <?php $client ...

  5. oracle客户端安装先决条件检查出现PRVF-7531错误

    场景:在局域网内,远程一台客户机进行客户端安装 度娘后,说一般情况下,由于操作系统未开启默认共享,导致Oracle无法检查环境的可用性. 查看server服务正常开启. 通过net share将c进行 ...

  6. npm install报错的解决方法

    解决方法 node版本不对,问问前端开发,node版本是什么版本,用nvm install,并切换到正常的node版本: git代码有时候会有冲突,把前端项目中的依赖包node_modules 和 p ...

  7. Centos查找Tomcat路径并重启

    [root@devrestcloud ~\]# find / -name \*tomcat\* [root@devrestcloud ~]# cd /usr/tomcat/apache-tomcat- ...

  8. CHDFS 安全便捷的大数据访问体验

    一.背景 云 HDFS(Cloud HDFS,CHDFS)是腾讯云提供的支持标准 HDFS 访问协议.卓越性能.分层命名空间的分布式文件系统. CHDFS 主要解决大数据场景下海量数据存储和数据分析, ...

  9. 在 MySQL 创造类似 PipelineDB 的流视图(continuous view)

    公司的系统采用的是 Google Cloud SQL 提供的 MySQL 数据库,由于历史原因,数据库成本极高,需要对它进行优化缩减成本. 相比 PostgresSQL,MySQL 主要缺少以下特性, ...

  10. django生命周期流程图与django路由层

    目录 一.django请求生命周期流程图 二.django路由层 1.路由匹配 2.转换器 3.正则匹配 不同版本的区别 正则匹配斜杠导致的区别 4.正则匹配的无名有名分组 分组匹配 无名分组 有名分 ...