代码中使用的是jdk1.8
版本,如果使用的是jdk1.7版本,则应当使用hutool 4.x版本。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.7</version>
</dependency>
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日。
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方法完成数组到集合的转换。
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);//运行结果:陆万柒仟伍佰伍拾陆元叁角贰分
}
}
注意:转换为大写只能精确到分(小数点儿后两位),之后的数字会被忽略。
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
}
}
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
}
}
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。
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);
}
}
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);
}
}
src/resources
目录下,需要重新import项目,以便在编译时顺利把资源文件拷贝到target目录下。如果提示找不到文件,请去target目录下确认文件是否存在;readStr
方法,该方法的第二个参数可以传入自定义的编码。假设我们想要读取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);
}
}
一些常用的判空方法,在org.apache.commons.lang
的StringUtils
类里面也都有,所以类似方法这里就不多进行介绍了,就把Hutool中特别一点的方法拿出来说一下。
这两个方法的参数都是可变参数,也就是说,它们都是可以同时校验多个字符串的。
由于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。
这两个方法的参数也都是可变参数,所以也都是可以同时校验多个字符串的。
由于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
方法校验的更全面一点。
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类型的,所以传具体值来替换模板时,是可以传任意类型的,并不仅仅局限于字符串类型。
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);
}
}
unzipFileBytes
方法的第一个参数除了可以传字符串形式的路径外,也可以传入一个File类型,只需要调用unzipFileBytes(File zipFile, String name)
方法即可;unzipFileBytes(String zipFilePath, Charset charset, String name)
方法即可,这里的第二个参数用于设置编码,第三个参数是压缩包里文件的文件名;unzipFileBytes
方法都是可以成功解析的,tar包好像不行;String text = new String(bytes,"UTF-8")
这样。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。
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压缩包
zip
方法的第二个参数必须为文件,不能为目录;zip
方法的第二个参数的压缩包的名字可以和"demo"目录名相同,也可以不同;zip
方法的第二个参数的“test”目录可以存在也可以不存在,存在的话压缩包就直接放到该目录中,不存在的话就先创建该目录,然后再把压缩包放入其中。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目录中的所有文件。
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压缩包
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"目录下
JSONUtil类中包含了String、javaBean以及JSONObject三者之间相互转换的方法,JSONArray相关的转换也有,由于我常用的是com.alibaba.fastjson
包下的类和方法来实现它们之间的相互转换,所以这里就不多说了。这里主要想介绍一下xml格式的字符串和json串之间的相互转换,以及从文件中读取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"
}
}
toStringPretty
方法,而是调用toString
方法;xmlToJson
方法进行转换的时候,会自动识别xml格式字符串中各节点的内容,假设节点的值是数字型,那么转换后的json串的该节点就是数字型,如果有节点的值是true或者false,转换后就是布尔型;xmlToJson
方法在转换时,对于0开头的数字型好像并不能识别,比如上面的BizType节点,转换后该节点的值就是字符串类型,而没有像IDType等节点一样是数字型;cn.hutool.json.XML#toJSONObject(String string, boolean keepStrings)
可以,只需toJSONObject方法的第二个参数为true即可。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>
toXmlStr
方法不能接收字符串类型参数,所以上面通过new的方式,把字符串转换成一个JSONObject对象作为参数进行传递。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());
}
}
{"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
方法的,这里就不多介绍了。
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);
}
}
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
方法,都是可以在方法中传入超时时间这个参数的,只不过这里我并没有细说。
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);
}
}
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)
方法的话,可以通过重写第三个参数中的方法来感知下载进度。
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
注意事项:
src/main/resources/config/cron.setting
中获取定时规则,如果没在项目中添加该配置文件的话,也可以调用CronUtil类的schedule(String schedulingPattern, Task task)
方法获取定时规则;CronUtil.start(true)
方法开启线程。需要注意的是,此模式下会在调用stop时立即结束所有作业线程,所以要确保你的作业可以被中断。<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
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);
}
}
生成的二维码如下图所示:
微信扫描二维码后就会进入到B站的主页。generate
方法的第一个参数不仅可以是url,也可以是具体的字符串内容,如果是具体的内容的话,扫描生成的二维码后展示的就是该参数的内容。
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);
}
}
生成的二维码如下图所示:
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);
}
}
生成的二维码如下图所示:
很多时候,二维码无法识别,这时就要调整纠错级别。纠错级别使用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);
}
}
生成的二维码如下图所示:
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
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论