Hutool工具集中常见API的用法_gongsl-CSDN博客

1.使用前的准备

1.1 jdk版本

代码中使用的是jdk1.8版本,如果使用的是jdk1.7版本,则应当使用hutool 4.x版本。

1.2 导入jar包

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.3.7</version>
</dependency>

2.Convert类的常用方法

2.1 toDate方法–字符串转日期

package com.gongsl.test;

import cn.hutool.core.convert.Convert;
import java.util.Date;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        Date date1 = Convert.toDate("2021/01/02");
        System.out.println(date1);//运行结果:Sat Jan 02 00:00:00 CST 2021

        Date date2 = Convert.toDate("20210102182025");
        System.out.println(date2);//运行结果:Sat Jan 02 18:20:25 CST 2021

        Date date3 = Convert.toDate("2021-01-02 18:20:25");
        System.out.println(date3);//运行结果:Sat Jan 02 18:20:25 CST 2021

        Date date4 = Convert.toDate("2021-13-02 18:20:25");
        System.out.println(date4);//运行结果:Sun Jan 02 18:20:25 CST 2022

        Date date5 = Convert.toDate("2021,01,02");
        System.out.println(date5);//运行结果:null

        Date date6 = Convert.toDate("2021,01,02", new Date());
        System.out.println(date6);//运行结果:Sat Jan 02 18:28:12 CST 2021
    }
}

这里的toDate方法不会抛异常,如果字符串格式不符合转换要求而无法成功转换的话,会默认返回null,所以上面date5的值就是null。我们也可以给toDate方法添加一个默认值,比如上面的data6,如果字符串能成功转换,自然就会返回转换后的内容,但是date6中的字符串不能成功转换,所以就会返回默认值,上面默认值设置的是当前系统时间。

注意:如果字符串的格式没问题,但是内容有问题,toDate方法也会自动识别是否可以进行转换。比如上面date4那里字符串的月份是13,一年是没有13个月的,这里toDate方法就进行了自动识别,所以就自动把字符串的2021-13-02转成了2022年1月2日。

2.2 toList方法–数组转集合

package com.gongsl.test;

import cn.hutool.core.convert.Convert;
import java.util.List;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        String[] arr = {"abc","hello","Tom"};
        List list = Convert.toList(arr);
        System.out.println(list.size());//运行结果:3
        //集合的运行结果:abc hello Tom
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");
        }
    }
}

不管是String类型、Object类型还是其他别的类型的数组,都可以通过toList方法完成数组到集合的转换。

2.3 digitToChinese方法–金额转大写

package com.gongsl.test;

import cn.hutool.core.convert.Convert;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        double d = 67556.32;
        String s = Convert.digitToChinese(d);
        System.out.println(s);//运行结果:陆万柒仟伍佰伍拾陆元叁角贰分
    }
}

注意:转换为大写只能精确到分(小数点儿后两位),之后的数字会被忽略。

3.DateUtil类的常用方法

3.1 获取Date类型以及String类型的当前时间

package com.gongsl.test;

import cn.hutool.core.date.DateUtil;
import java.util.Date;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        //当前时间
        Date date = DateUtil.date();
        System.out.println(date);//运行结果:2021-01-02 19:37:22

        //当前时间
        long l = System.currentTimeMillis();
        Date time = DateUtil.date(l);
        System.out.println(time);//运行结果:2021-01-02 19:37:22

        //当前时间字符串,格式:yyyy-MM-dd HH:mm:ss
        String now = DateUtil.now();
        System.out.println(now);//运行结果:2021-01-02 19:37:22

        //当前日期字符串,格式:yyyy-MM-dd
        String today= DateUtil.today();
        System.out.println(today);//运行结果:2021-01-02
    }
}

3.2 字符串和日期之间的相互转换

package com.gongsl.test;

import cn.hutool.core.date.DateUtil;
import java.util.Date;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        String dateStr = "20210102201625";
        Date date = DateUtil.parse(dateStr);
        System.out.println(date);//运行结果:2021-01-02 20:16:25

        //使用默认格式:yyyy-MM-dd HH:mm:ss
        String str = DateUtil.formatDateTime(new Date());
        System.out.println(str);//运行结果:2021-01-02 20:10:16

        //自定义格式
        String time = DateUtil.format(new Date(), "yyyy/MM/dd");
        System.out.println(time);//运行结果:2021/01/02
    }
}

4.IoUtil类的常用方法

4.1 copy方法–文件的拷贝

package com.gongsl.test;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        BufferedInputStream in = FileUtil.getInputStream("E:\\new\\a.txt");
        BufferedOutputStream out = FileUtil.getOutputStream("E:\\new\\b.txt");
        long copySize = IoUtil.copy(in, out);
        System.out.println(copySize);
    }
}

上面copy方法的返回值copySize指的是a.txt文件内容的大小,如果该文件的内容是“123abc”的话,那么copySize的值就是6。如果内容中有中文的话,由于编码不同,中文占的长度不一样,所以包含中文时不同编码环境下copySize的值会不一样。

注意:使用copy方法进行文件拷贝时,也是可以指定缓存区大小的,比如IoUtil.copy(in,out,1024)就是指缓存区的大小是1024,不指定的话默认是8192。

5.文件的读写操作

5.1 使用FileReader类和FileWriter类进行文件的读写

package com.gongsl.test;

import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.io.file.FileWriter;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        //默认UTF-8编码,可以在构造中传入第二个参数来自定义编码方式
        FileReader fileReader = new FileReader("E:\\new\\a.txt");
        String result = fileReader.readString();
        System.out.println(result);

        //默认UTF-8编码,可以在构造中传入第二个参数来自定义编码方式
        FileWriter writer = new FileWriter("E:\\new\\b.txt");
        String str = "test123测试使用sdfghj";
        writer.write(str);
    }
}

5.2 使用ResourceUtil类读取项目中的文件

ResourceUtil中最核心的方法是getResourceObj,此方法可以根据传入路径是否为绝对路径而返回不同的实现。比如路径是:file:/opt/test,或者/opt/test都会被当作绝对路径,此时调用FileResource来读取数据。如果不满足以上条件,默认调用ClassPathResource读取classpath中的资源或者文件。

假设我们的文件存放在src/resources/config目录下,则读取的代码如下所示:

package com.gongsl.test;

import cn.hutool.core.io.resource.ResourceUtil;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        String str = ResourceUtil.readUtf8Str("config/abc.txt");
        System.out.println(str);
    }
}
注意事项:
  1. 需要注意的是,在IDEA中新加入文件到src/resources目录下,需要重新import项目,以便在编译时顺利把资源文件拷贝到target目录下。如果提示找不到文件,请去target目录下确认文件是否存在;
  2. 如果需要自定义编码方式进行文件的读取,可以使用ResourceUtil类中的readStr方法,该方法的第二个参数可以传入自定义的编码。

6.properties的封装类Props

假设我们想要读取src/resources目录下的properties文件,比如log4j.properties文件,那么代码如下:

package com.gongsl.test;

import cn.hutool.setting.dialect.Props;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        //默认ISO-8859-1编码,可以在构造中传入第二个参数来自定义编码方式
        Props props = new Props("log4j.properties");
        String str = props.getStr("log4j.appender.console");
        System.out.println(str);
    }
}
注意事项:
  1. Props类继承自Properties,所以可以兼容Properties类;
  2. 如果我们想要根据properties文件中的key值获取对应的value值,直接调用Props类的getStr方法即可。

7.StrUtil类的常用方法

一些常用的判空方法,在org.apache.commons.langStringUtils类里面也都有,所以类似方法这里就不多进行介绍了,就把Hutool中特别一点的方法拿出来说一下。

7.1 hasBlank方法和isAllNotBlank方法

这两个方法的参数都是可变参数,也就是说,它们都是可以同时校验多个字符串的。

由于isAllNotBlank(CharSequence... args)方法的底层就是!hasBlank(CharSequence... strs),所以这里只介绍一个方法即可,就说说isAllNotBlank(CharSequence... args)方法吧,代码案例如下所示:

package com.gongsl.test;

import cn.hutool.core.util.StrUtil;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        boolean test1 = StrUtil.isAllNotBlank("123","test");
        System.out.println(test1);//运行结果:true

        boolean test2 = StrUtil.isAllNotBlank();
        System.out.println(test2);//运行结果:false

        boolean test3 = StrUtil.isAllNotBlank("123","test","");
        System.out.println(test3);//运行结果:false

        boolean test4 = StrUtil.isAllNotBlank("123","test","  ");
        System.out.println(test4);//运行结果:false

        boolean test5 = StrUtil.isAllNotBlank("123","test",null);
        System.out.println(test5);//运行结果:false

        boolean test6 = StrUtil.isAllNotBlank("123","test","",null);
        System.out.println(test6);//运行结果:false

        boolean test7 = StrUtil.isAllNotBlank("123","test","\n");
        System.out.println(test7);//运行结果:false
    }
}

注意:这里的isAllNotBlank方法在校验入参中的多个字符串时,只要有一个不满足要求,就会返回false。

7.2 hasEmpty方法和isAllNotEmpty方法

这两个方法的参数也都是可变参数,所以也都是可以同时校验多个字符串的。

由于isAllNotEmpty(CharSequence... args)方法的底层就是!hasEmpty(CharSequence... strs),所以这里只介绍一个方法即可,就说说isAllNotEmpty(CharSequence... args)方法吧,代码案例如下所示:

package com.gongsl.test;

import cn.hutool.core.util.StrUtil;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        boolean test1 = StrUtil.isAllNotEmpty("123","test");
        System.out.println(test1);//运行结果:true

        boolean test2 = StrUtil.isAllNotEmpty();
        System.out.println(test2);//运行结果:false

        boolean test3 = StrUtil.isAllNotEmpty("123","test","");
        System.out.println(test3);//运行结果:false

        boolean test4 = StrUtil.isAllNotEmpty("123","test","  ");
        System.out.println(test4);//运行结果:true

        boolean test5 = StrUtil.isAllNotEmpty("123","test",null);
        System.out.println(test5);//运行结果:false

        boolean test6 = StrUtil.isAllNotEmpty("123","test","",null);
        System.out.println(test6);//运行结果:false

        boolean test7 = StrUtil.isAllNotEmpty("123","test","\n");
        System.out.println(test7);//运行结果:true
    }
}

这里的isAllNotEmpty方法和上面isAllNotBlank方法的最大区别就是,isAllNotEmpty方法认为" ""\n"不算空,所以即便参数中包含了它们,也会返回true。所以我认为相对来说isAllNotBlank方法校验的更全面一点。

7.3 format方法的用法

package com.gongsl.test;

import cn.hutool.core.util.StrUtil;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        String template = "{}爱{},就像老鼠爱大米";
        String str = StrUtil.format(template, "我", "你");
        System.out.println(str);//运行结果:我爱你,就像老鼠爱大米
    }
}

这里先使用字符串模板代替字符串进行拼接,然后再使用具体值进行填充。format方法的可变参数是Object类型的,所以传具体值来替换模板时,是可以传任意类型的,并不仅仅局限于字符串类型。

8.ZipUtil类的常用方法

8.1 unzipFileBytes方法–获取压缩包中的指定文件

package com.gongsl.test;

import cn.hutool.core.util.ZipUtil;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        String path = "E:\\new\\mmall.war";
        //读取mmall.war压缩包中index.jsp文件的内容
        byte[] bytes = ZipUtil.unzipFileBytes(path, "index.jsp");
        String text = new String(bytes);
        System.out.println(text);
    }
}
注意事项:
  1. 这里的unzipFileBytes方法的第一个参数除了可以传字符串形式的路径外,也可以传入一个File类型,只需要调用unzipFileBytes(File zipFile, String name)方法即可;
  2. 在读取压缩包文件内容的时候是可以自定义编码方式的,调用unzipFileBytes(String zipFilePath, Charset charset, String name)方法即可,这里的第二个参数用于设置编码,第三个参数是压缩包里文件的文件名;
  3. 对于zip包、war包以及jar包,unzipFileBytes方法都是可以成功解析的,tar包好像不行;
  4. 上面那个index.jsp文件如果是在mmall.war的mmall目录里,一定要带上目录名,即写成“mmall/index.jsp”;
  5. 上面byte[]数组转String的时候,我是直接通过构造方法new的一个String对象,这里通过构造方法把byte[]数组转成String的时候,也是可以指定编码的,比如String text = new String(bytes,"UTF-8")这样。

8.2 zip方法–打包成压缩包

8.2.1 打包到当前目录
package com.gongsl.test;

import cn.hutool.core.util.ZipUtil;
import java.io.File;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        //将"E:\new\demo"目录下的所有内容打包到"E:\new\demo.zip"文件中
        File file = ZipUtil.zip("E:\\new\\demo");
        System.out.println(file.getName());//运行结果:demo.zip
    }
}
//运行main方法后,就会在"E:\new"目录下多一个demo.zip压缩包

注意:这种方式虽然既能打包文件也能打包文件夹,但只能打包到当前目录,且打包后的压缩包的名字就是目录名,像这类的目录是"E:\new\demo",那么生成的压缩包的名字就只能是demo.zip。

8.2.2 指定打包后的文件名及保存的目录
package com.gongsl.test;

import cn.hutool.core.util.ZipUtil;
import java.io.File;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        //将"E:\new\demo"目录下的所有内容打包到"E:\new\test\abc.zip"文件中
        File file = ZipUtil.zip("E:\\new\\demo","E:\\new\\test\\abc.zip");
        System.out.println(file.getName());//运行结果:abc.zip
    }
}
//运行main方法后,就会在"E:\new\test"目录下多一个abc.zip压缩包
注意事项:
  1. 这里zip方法的第二个参数必须为文件,不能为目录;
  2. 这里zip方法的第二个参数的压缩包的名字可以和"demo"目录名相同,也可以不同;
  3. 这里zip方法的第二个参数的“test”目录可以存在也可以不存在,存在的话压缩包就直接放到该目录中,不存在的话就先创建该目录,然后再把压缩包放入其中。
8.2.3 可选是否包含被打包的目录
package com.gongsl.test;

import cn.hutool.core.util.ZipUtil;
import java.io.File;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        //将"E:\new\demo"目录下的所有文件打包到"E:\new\test\abc.zip"文件中
        File file = ZipUtil.zip("E:\\new\\demo","E:\\new\\test\\abc.zip",true);
        System.out.println(file.getName());//运行结果:abc.zip
    }
}
//运行main方法后,就会在"E:\new\test"目录下多一个abc.zip压缩包

这里调用的是带有三个参数的zip方法,第三个参数为true的话,表示在打包的时候,会连目录一并打包进压缩包中。我们这里要打包的是"E:\new\demo"目录下的所有文件,使用第三个参数为true的zip方法的话,当我们打开abc.zip压缩包的时候,压缩包里是包含demo目录的,进入这个目录里面后才能看到该目录下的所有文件。如果这里使用的是两个参数的zip方法,那么当我们打开abc.zip压缩包的时候,压缩包里是不包含demo目录的,我们直接看到的就是demo目录中的所有文件。

8.2.4 选择多个文件或目录进行打包
package com.gongsl.test;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ZipUtil;
import java.io.File;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        //将"E:\new"目录下的多个文件及文件夹打包到"E:\new\abc.zip"文件中
        File file = ZipUtil.zip(FileUtil.file("E:\\new\\abc.zip"), true,
                FileUtil.file("E:\\new\\log"),
                FileUtil.file("E:\\new\\b.txt"),
                FileUtil.file("E:\\new\\homework"));
        System.out.println(file.getName());//运行结果:abc.zip
    }
}
//运行main方法后,就会在"E:\new"目录下多一个abc.zip压缩包

8.3 unzip方法–压缩包的解压

package com.gongsl.test;

import cn.hutool.core.util.ZipUtil;
import java.io.File;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        //将"E:\new\abc.zip"压缩包解压到"E:\new\test"目录下,返回值是解压到的目录
        File file = ZipUtil.unzip("E:\\new\\abc.zip","E:\\new\\test");
        System.out.println(file.getName());//运行结果:test
    }
}
//运行main方法后,就会将abc.zip压缩包中的所有文件或文件夹解压到"E:\new\test"目录下

9.JSONUtil类的常用方法

JSONUtil类中包含了String、javaBean以及JSONObject三者之间相互转换的方法,JSONArray相关的转换也有,由于我常用的是com.alibaba.fastjson包下的类和方法来实现它们之间的相互转换,所以这里就不多说了。这里主要想介绍一下xml格式的字符串和json串之间的相互转换,以及从文件中读取json串的一些方法。

9.1 XML转JSON

package com.gongsl.test;

import cn.hutool.json.JSONUtil;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "<DayFlowInfoQryReq>\n" +
                "    <IDType>12</IDType>\n" +
                "    <IDItemRange>13567895432</IDItemRange>\n" +
                "    <BizType>01</BizType>\n" +
                "    <POCont>\n" +
                "        <BooleanTest>true</BooleanTest>\n" +
                "        <OprTime>20210103161025</OprTime>\n" +
                "    </POCont>\n" +
                "    <IdentCode>3240ad5b9b43a</IdentCode>\n" +
                "</DayFlowInfoQryReq>";
        String jsonStr = JSONUtil.xmlToJson(xmlStr).toStringPretty();
        System.out.println(jsonStr);
    }
}
运行结果:
{
    "DayFlowInfoQryReq": {
        "IDItemRange": 13567895432,
        "BizType": "01",
        "POCont": {
            "OprTime": 20210103161025,
            "BooleanTest": true
        },
        "IDType": 12,
        "IdentCode": "3240ad5b9b43a"
    }
}
注意事项:
  1. 如果不想对转换后的json串进行格式化,那上面就不要调用toStringPretty方法,而是调用toString方法;
  2. 使用JSONUtil类中的xmlToJson方法进行转换的时候,会自动识别xml格式字符串中各节点的内容,假设节点的值是数字型,那么转换后的json串的该节点就是数字型,如果有节点的值是true或者false,转换后就是布尔型;
  3. 我发现xmlToJson方法在转换时,对于0开头的数字型好像并不能识别,比如上面的BizType节点,转换后该节点的值就是字符串类型,而没有像IDType等节点一样是数字型;
  4. 如果我们想让转换后的json字符串中各节点的值都是字符串类型的话,JSONUtil类中暂时没有方法可以满足要求,但是cn.hutool.json.XML#toJSONObject(String string, boolean keepStrings)可以,只需toJSONObject方法的第二个参数为true即可。

9.2 JSON转XML

package com.gongsl.test;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        String jsonStr = "{\n" +
                "    \"DayFlowInfoQryReq\": {\n" +
                "        \"IDItemRange\": 13567895432,\n" +
                "        \"BizType\": \"01\",\n" +
                "        \"POCont\": {\n" +
                "            \"OprTime\": 20210103161025,\n" +
                "            \"BooleanTest\": true\n" +
                "        },\n" +
                "        \"IDType\": 12,\n" +
                "        \"IdentCode\": \"3240ad5b9b43a\"\n" +
                "    }\n" +
                "}";
        String xmlStr = JSONUtil.toXmlStr(new JSONObject(jsonStr));
        System.out.println(xmlStr);
    }
}
运行结果:
<DayFlowInfoQryReq><IDItemRange>13567895432</IDItemRange><BizType>01</BizType><POCont><OprTime>20210103161025</OprTime><BooleanTest>true</BooleanTest></POCont><IDType>12</IDType><IdentCode>3240ad5b9b43a</IdentCode></DayFlowInfoQryReq>

使用XML格式化工具手动格式化后如下所示:

<DayFlowInfoQryReq>
  <IDItemRange>13567895432</IDItemRange>
  <BizType>01</BizType>
  <POCont>
    <OprTime>20210103161025</OprTime>
    <BooleanTest>true</BooleanTest>
  </POCont>
  <IDType>12</IDType>
  <IdentCode>3240ad5b9b43a</IdentCode>
</DayFlowInfoQryReq>
注意事项:
  1. json转xml的时候,json串是否是格式化的对结果无影响,上面代码是为了看的方便,所以才使用了格式化的json串进行xml的转换;
  2. 由于toXmlStr方法不能接收字符串类型参数,所以上面通过new的方式,把字符串转换成一个JSONObject对象作为参数进行传递。

9.3 读取文件中的JSON串

package com.gongsl.test;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import java.io.File;
import java.nio.charset.Charset;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        File file = new File("E:\\new\\test.json");
        JSONObject jsonObject = JSONUtil.readJSONObject(file, Charset.forName("UTF-8"));
        System.out.println(jsonObject.toStringPretty());
    }
}
test.json文件的内容:
{"DayFlowInfoQryReq":{"IDItemRange":13567895432,"BizType":"01","POCont":{"OprTime":20210103161025,"BooleanTest":true,"ChinaTest":"中文测试"},"IDType":"12","IdentCode":"3240ad5b9b43a"}}
代码运行结果:
{
    "DayFlowInfoQryReq": {
        "IDItemRange": 13567895432,
        "BizType": "01",
        "POCont": {
            "OprTime": 20210103161025,
            "ChinaTest": "中文测试",
            "BooleanTest": true
        },
        "IDType": "12",
        "IdentCode": "3240ad5b9b43a"
    }
}

在JSONUtil类中,除了有readJSONObject方法,也是有readJSONArray方法的,这里就不多介绍了。

10.HttpUtil类的常用方法

10.1 GET请求的常用方法

package com.gongsl.test;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.http.HttpUtil;
import java.util.HashMap;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        //最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS
        String result1 = HttpUtil.get("http://learning.happymmall.com/centos.html");
        System.out.println(result1);

        //当无法识别页面编码的时候,可以自定义请求页面的编码
        String result2 = HttpUtil.get("http://learning.happymmall.com/centos.html", CharsetUtil.CHARSET_UTF_8);
        System.out.println(result2);

        //可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
        HashMap<String, Object> paramMap = new HashMap<String, Object>();
        paramMap.put("city", "杭州");

        String result3 = HttpUtil.get("https://www.baidu.com", paramMap);
        System.out.println(result3);
    }
}

10.2 POST请求的常用方法

package com.gongsl.test;

import cn.hutool.http.HttpUtil;
import java.util.HashMap;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        //发送请求体body到对应地址(可以是xml格式或者json格式的字符串,也可以是a=1&b=2这种格式的字符串)
        String result1= HttpUtil.post("https://www.baidu.com","{\"name\":\"123\",\"type\":\"abc\"}");
        System.out.println(result1);

        //发送post表单数据到对应地址
        HashMap<String, Object> paramMap = new HashMap<String, Object>();
        paramMap.put("name", "123");
        paramMap.put("type", "abc");
        String result2 = HttpUtil.post("https://www.baidu.com", paramMap);
        System.out.println(result2);
    }
}

注意:无论是get方法还是post方法,都是可以在方法中传入超时时间这个参数的,只不过这里我并没有细说。

10.3 文件的上传

package com.gongsl.test;

import cn.hutool.core.io.FileUtil;
import cn.hutool.http.HttpUtil;
import java.util.HashMap;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        HashMap<String, Object> paramMap = new HashMap<>();
        //文件上传只需将参数中的键指定(默认是file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
        paramMap.put("file", FileUtil.file("D:\\abc.jpg"));
        String result = HttpUtil.post("https://www.baidu.com", paramMap);
        System.out.println(result);
    }
}

10.4 文件的下载

package com.gongsl.test;

import cn.hutool.core.io.FileUtil;
import cn.hutool.http.HttpUtil;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:55
 */
public class HutoolTest {
    public static void main(String[] args) {
        String fileUrl = "http://learning.happymmall.com/nginx/linux-nginx-1.10.2.tar.gz";
        //将文件下载后保存在E盘的new目录想,返回结果为下载文件的大小
        long size = HttpUtil.downloadFile(fileUrl, FileUtil.file("E:\\new"));
        System.out.println("size: " + size);//size: 910812
        
        String strSize = FileUtil.readableFileSize(size);
        System.out.println("readableFileSize: " + strSize);//readableFileSize: 889.46 kB
    }
}

注意:如果调用的是downloadFile(String url, File destFile, StreamProgress streamProgress)方法的话,可以通过重写第三个参数中的方法来感知下载进度。

11.定时任务

HutoolTest类中的代码:

package com.gongsl.test;

import cn.hutool.cron.CronUtil;
import cn.hutool.cron.task.Task;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:58
 */
public class HutoolTest {
    public static void main(String[] args){
        //表示支持秒级别的定时任务
        CronUtil.setMatchSecond(true);
        CronUtil.schedule("* * * * * ?", new Task() {
            @Override
            public void execute() {
                CronTest.run();
            }
        });
        CronUtil.start();
    }
}

CronTest类中的代码:

package com.gongsl.test;

import cn.hutool.cron.CronUtil;

/**
 * @Author: gongsl
 * @Date: 2021-01-03 16:56
 */
public class CronTest {
    public static int i=1;

    public static void run(){
        System.out.println("测试执行情况--->"+(i++));
        if(i>10){
            CronUtil.stop();
        }
    }
}

执行HutoolTest类的main方法后的运行结果:

测试执行情况--->1
测试执行情况--->2
测试执行情况--->3
测试执行情况--->4
测试执行情况--->5
测试执行情况--->6
测试执行情况--->7
测试执行情况--->8
测试执行情况--->9
测试执行情况--->10

注意事项:

  1. 对于一个maven项目,默认情况下会从src/main/resources/config/cron.setting中获取定时规则,如果没在项目中添加该配置文件的话,也可以调用CronUtil类的schedule(String schedulingPattern, Task task)方法获取定时规则;
  2. 如果想让执行的作业同定时任务线程同时结束,可以将定时任务设为守护线程,即调用CronUtil.start(true)方法开启线程。需要注意的是,此模式下会在调用stop时立即结束所有作业线程,所以要确保你的作业可以被中断。

12.生成二维码

12.1 引入需要的jar包

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.3.3</version>
</dependency>

12.2 生成二维码到文件

package com.gongsl.test;

import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import java.io.File;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:58
 */
public class HutoolTest {
    public static void main(String[] args){
        //生成指定url对应的二维码到文件,宽和高都是300像素
        File file = FileUtil.file("E:\\new\\QrCode.jpg");
        QrCodeUtil.generate("https://www.bilibili.com/", 300, 300, file);
    }
}

生成的二维码如下图所示:
QrCode
微信扫描二维码后就会进入到B站的主页。generate方法的第一个参数不仅可以是url,也可以是具体的字符串内容,如果是具体的内容的话,扫描生成的二维码后展示的就是该参数的内容。

12.3 自定义生成二维码的参数

package com.gongsl.test;

import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import java.awt.*;
import java.io.File;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:58
 */
public class HutoolTest {
    public static void main(String[] args){
        //设置二维码的宽和高都是300像素
        QrConfig config = new QrConfig(300, 300);
        //设置边距,既二维码和背景之间的边距
        config.setMargin(2);
        //设置前景色,既二维码颜色
        config.setForeColor(new Color(0, 255, 255));
        //设置背景色
        config.setBackColor(new Color(128, 128, 128));
        //生成二维码到文件,也可以到流
        File file = FileUtil.file("E:\\new\\QrCode.jpg");
        QrCodeUtil.generate("https://www.bilibili.com/", config, file);
    }
}

生成的二维码如下图所示:

QrCode1

12.4 为生成的二维码增加logo图片

package com.gongsl.test;

import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import java.io.File;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:58
 */
public class HutoolTest {
    public static void main(String[] args){
        //设置二维码的宽和高都是300像素
        QrConfig config = new QrConfig(300, 300);
        //设置边距,既二维码和背景之间的边距
        config.setMargin(1);
        //设置二维码中的logo图片
        config.setImg("E:\\new\\logo_small.jpg");

        File file = FileUtil.file("E:\\new\\QrCode.jpg");
        QrCodeUtil.generate("https://www.bilibili.com/", config, file);

    }
}

生成的二维码如下图所示:

QrCode2

12.5 调整纠错级别

很多时候,二维码无法识别,这时就要调整纠错级别。纠错级别使用zxing的ErrorCorrectionLevel枚举封装,包括:L、M、Q、H几个参数,由低到高。低级别的像素块更大,可以远距离识别,但是遮挡就会造成无法识别。高级别则相反,像素块小,允许遮挡一定范围,但是像素块更密集。

package com.gongsl.test;

import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.io.File;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:58
 */
public class HutoolTest {
    public static void main(String[] args){
        QrConfig config = new QrConfig();
        //高纠错级别
        config.setErrorCorrection(ErrorCorrectionLevel.H);
        File file = FileUtil.file("E:\\new\\QrCode.jpg");
        QrCodeUtil.generate("https://www.bilibili.com/", config, file);
    }
}

生成的二维码如下图所示:

QrCode3

12.6 识别二维码

package com.gongsl.test;

import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;

/**
 * @Author: gongsl
 * @Date: 2021-01-02 17:58
 */
public class HutoolTest {
    public static void main(String[] args){
        String result = QrCodeUtil.decode(FileUtil.file("E:\\new\\QrCode.jpg"));
        System.out.println(result);//运行结果:https://www.bilibili.com/
    }
}

生成二维码的时候generate方法的第一个参数是什么,这里识别二维码的时候就会识别出什么。


原网址: 访问
创建于: 2021-03-02 13:01:35
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论