//13.转换为指定类型
Object o = Convert.convertQuietly(float.class, 9);
日期时间是提供针对JDK中Date和Calendar对象的封装;
3.2.1、日期时间工具-DateUtil
这其中的封装主要是日期和字符串之间的转换,以及提供对日期的定位(一个月前等);
/1.Date、long、Calendar之间的相互转换/
//当前时间
DateTime date1 = DateUtil.date();
DateTime date2 = DateUtil.date(Calendar.getInstance());
Date date3 = DateUtil.date(System.currentTimeMillis());
//当前时间字符串,格式:yyyy-MM-dd HH:mm:ss
String now = DateUtil.now();
//当前日期字符串,格式:yyyy-MM-dd
String today = DateUtil.today();
/2.字符串转日期/
String dateStr = “2021-10-21 18:00:01”;
Date date = DateUtil.parse(dateStr, “yyyy-MM-dd HH:mm:ss”);
/3.格式化日期输出/
String d = “2021-10-21 18:27:01”;
Date parse = DateUtil.parse(d);//2021-10-21 00:00:00
//定义的样式
String format = DateUtil.format(parse, “yyyy/MM/dd”); //2021/10/21
//常用格式的格式化
String formatDate = DateUtil.formatDate(parse); //2021-10-21
//时间
String formatDateTime = DateUtil.formatDateTime(parse);//2021-10-21 18:27:01
//时分秒
String formatTime = DateUtil.formatTime(parse);//18:27:01
/4.获取Date对象的某个部分/
//获得年
int year = DateUtil.year(date1);//2021
//获得月(从0开始)
int month = DateUtil.month(date1);//9
//获得月份枚举
Month monthEnum = DateUtil.monthEnum(date1);//OCTOBER
/5.开始和结束时间/
//一天的开始
DateTime beginOfDay = DateUtil.beginOfDay(date);//2021-10-21 00:00:00
//一天的结束时间
DateTime endOfDay = DateUtil.endOfDay(date);//2021-10-21 23:59:59
/6.日期时间偏移/
//偏移两天
Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2); //2021-10-23 18:00:01
//后偏移3天
DateTime newDate2 = DateUtil.offsetDay(date, 3); //2021-10-24 18:00:01
//前偏移3小时
DateTime newDate3 = DateUtil.offsetHour(date, -3); //2021-10-21 15:00:01
//昨天
DateTime yesterday = DateUtil.yesterday();
//明天
DateTime tomorrow = DateUtil.tomorrow();
//上周
DateTime lastWeek = DateUtil.lastWeek();
//下月
DateTime nextMonth = DateUtil.nextMonth();
/7.时间差/
long between = DateUtil.between(date, DateUtil.parse(“2021-10-01 00:00:01”), DateUnit.DAY);//20
/8.星座、属相、年龄、是否闰年/
String zodiac = DateUtil.getZodiac(Month.FEBRUARY.getValue(), 19);//双鱼座
String chineseZodiac = DateUtil.getChineseZodiac(2002);//马
int age = DateUtil.ageOfNow(“2002-05-21”);//19
boolean leapYear = DateUtil.isLeapYear(2021);//false
3.2.2、日期时间对象-DateTime
DateTime类继承于java.util.Date类,为Date类扩展了众多简便方法,这些方法多是DateUtil静态方法的对象表现形式,使用DateTime对象可以完全替代开发中Date对象的使用。
//使用对象获取日期成员的年、月、日
DateTime dateTime = new DateTime(“2021-01-05 12:34:23”, DatePattern.NORM_DATETIME_FORMAT);
int year = dateTime.year();//2021
//月份
Month month = dateTime.monthEnum();//JANUARY
//日
int dayOfMonth = dateTime.dayOfMonth();//5
//格式化为字符串
String toString = dateTime.toString();
3.2.3、农历日期-ChineseDate
农历日期,提供生效、天干地支、传统节日等方法;
//通过农历构建
ChineseDate chineseDate = new ChineseDate(2002, 05, 21);
//通过公历构建
ChineseDate chineseDate1 = new ChineseDate(DateUtil.parseDate(“2002-01-21”));
String chineseMonth = chineseDate.getChineseMonth();//一月
String chineseMonthName = chineseDate.getChineseMonthName();//正月
// 初一
String chineseDay = chineseDate.getChineseDay();
String cyclical = chineseDate.getCyclical();// 壬午
//生肖
String chineseZodiac = chineseDate.getChineseZodiac();//马
// 传统节日
String festivals = chineseDate.getFestivals();
// 天干地支,生肖、农历
String all = chineseDate.toString();//壬午马年 五月廿一
//天干地支
String cyclicalYMD = chineseDate.getCyclicalYMD();//壬午年丙午月庚午日
3.2.4、计时器工具
计时器功计算方法或过程执行的时间
TimeInterval timer = DateUtil.timer();
/**
- 代码执行过程
*/
ThreadUtil.sleep(100);
//花费毫秒数
long interval = timer.interval();
//返回花费时间,并重置开始时间
timer.intervalRestart();
//花费分钟数
timer.intervalMinute();
3.3.1、字符串工具-StrUtil
String str = “abCDEfghi”;
//是否为空
boolean blank = StrUtil.isBlank(str);//false
//是否不为空
boolean notBlank = StrUtil.isNotBlank(str);//true
//去掉字符串后缀(removeprefix:前缀)
String removeSuffix = StrUtil.removeSuffix(“test.txt”, “.txt”);//test
//忽略大小写去掉前缀(removeSuffixIgnoreCase:去掉后缀)
String removePrefixIgnoreCase = StrUtil.removePrefixIgnoreCase(str, “A”);//bCDEfghi
//sub方法
//顺数第2个到第4个,包含尾部包含头
String sub = StrUtil.sub(str, 2, 4);//CD
//-3表示倒数第三个字符
String sub1 = StrUtil.sub(str, 2, -3);//CDEf
//format方法(使用字符串模板代替字符串拼接)
String template = “{}爱{}!{}”;
String fin = StrUtil.format(template, “我”, “JAVA”,“哈哈哈”); //我爱JAVA!哈哈哈
3.3.2、数字工具
/数字工具/
//加
double add = NumberUtil.add(1, 1);//2.0
//减
double sub2 = NumberUtil.sub(3, 1);//2.0
//乘
double mul = NumberUtil.mul(3, 3);//9.0
//除
double div = NumberUtil.div(3, 1);//3.0
//保留小数
BigDecimal round = NumberUtil.round(123456.123456, 4);//123456.1235
//直接舍弃
BigDecimal round1 = NumberUtil.round(123456.123456, 4, RoundingMode.DOWN);//123456.1234
//主要采用四舍五入的方式
String roundStr = NumberUtil.roundStr(123456.123456, 5);//123456.12346
//对decimal进行格式化
//每三位以逗号进行分隔
String decimalFormat = NumberUtil.decimalFormat(“,###”, 299792458);//299,792,458
//取一位整数
String s = NumberUtil.decimalFormat(“0”, 2999.12356);//2999
//取一位整数和两位小数
String s1 = NumberUtil.decimalFormat(“0.00”, 2999.12356);//2999.12
//显示为科学计数法,并取五位小数
String s2 = NumberUtil.decimalFormat(“#.#####E0”, 299.12356);//2.99124E2
//加入单位
String s3 = NumberUtil.decimalFormat(“,###米”, 29912356);//29,912,356米
//以百分比方式计数,并取两位小数
String s4 = NumberUtil.decimalFormat(“#.##%”, 0.272365);//27.24%
//生成不重复随机数(开始数、结束数、随机数数量)
int[] ints = NumberUtil.generateRandomNumber(3, 30, 5);
String s5 = Arrays.toString(ints);//[12, 24, 29, 13, 5]
//包装类型
Integer[] integers = NumberUtil.generateBySet(3, 30, 5);
String s6 = Arrays.toString(integers);//[16, 17, 18, 29, 13]
//整数列表(有序整数列表)
int[] range = NumberUtil.range(3, 30, 5);
String s7 = Arrays.toString(range);//[3, 8, 13, 18, 23, 28]
3.3.3、其他工具类
包含:数组工具、随机工具、身份证工具、脱敏工具、社会信用码
/运行命令行工具/
List ipconfig = RuntimeUtil.execForLines(“ipconfig”);
/数组工具/
//判断非空
int[] a = {};
boolean empty = ArrayUtil.isEmpty(a);//true
//判断非空
boolean notEmpty = ArrayUtil.isNotEmpty(a);//false
/随机工具-RandomUtil/
//产生10~20的随机数
int randomInt = RandomUtil.randomInt(10, 20);
//获得一个长度为4只包含数字的字符串
String randomNumbers = RandomUtil.randomNumbers(4);
//获得一个随机的字符串(只包含数字和字符)
String randomString = RandomUtil.randomString(“123456AbC”,7);
/UUID/
//生成的是不带-的字符串
String simpleUUID = IdUtil.simpleUUID();
/身份证工具/
String idCard = “612703199109010012”;
//验证身份证是否合法
boolean validCard = IdcardUtil.isValidCard(idCard);//true
//获取生日
String birthByIdCard = IdcardUtil.getBirthByIdCard(idCard);//19910901
//获取年龄
int ageByIdCard = IdcardUtil.getAgeByIdCard(idCard);//30
//获取生日年
Short yearByIdCard = IdcardUtil.getYearByIdCard(idCard);//1991
//获取生日月
Short monthByIdCard = IdcardUtil.getMonthByIdCard(idCard);//9
//获取生日天
Short dayByIdCard = IdcardUtil.getDayByIdCard(idCard);//1
//获取性别
int genderByIdCard = IdcardUtil.getGenderByIdCard(idCard);//1
//获取省份
String provinceByIdCard = IdcardUtil.getProvinceByIdCard(idCard);//陕西
/脱敏工具/
//身份证号码(前一位后两位)
String idCardNum = DesensitizedUtil.idCardNum(idCard, 1, 2);//6***************12
//手机号
String mobilePhone = DesensitizedUtil.mobilePhone(“13912349832”);//139****9832
//全部脱敏
String password = DesensitizedUtil.password(“123456”);//******
//StrUtil(索引为1开始索引为3结束)
String hide = StrUtil.hide(“123456”, 1, 3);//1**456
/*
-
社会信用码(18位):
-
第一部分:登记管理部门代码1位 (数字或大写英文字母)
-
第二部分:机构类别代码1位 (数字或大写英文字母)
-
第三部分:登记管理机关行政区划码6位 (数字)
-
第四部分:主体标识码(组织机构代码)9位 (数字或大写英文字母)
-
第五部分:校验码1位 (数字或大写英文字母)
*/
//随机生成社会信用码
String randomCreditCode = CreditCodeUtil.randomCreditCode();//B6123727GNXBQA6FRJ
//校验
boolean creditCode = CreditCodeUtil.isCreditCode(randomCreditCode);//true
/HashMap扩展-Dict/
//通过链式构造,创建Dict对象
Dict dict = Dict.create()
.set(“key1”, 1)//int
.set(“key2”, 1000L)//long
.set(“key3”, DateTime.now());//Date
Long v2 = dict.getLong(“key1”);//1
System.out.println(v2);
/打印封装/
String[] a = {“abc”, “bcd”, “def”};
Console.log(a);//[abc, bcd, def]
Console.error(“错误信息!”);//错误信息!
/字段验证器/
//验证给定字符串是否为邮箱格式
boolean email = Validator.isEmail(“123@163.com”);//true
//是否是社会信用码
boolean isCreditCode = Validator.isCreditCode(“B6123727GNXBQA6FRJ”);//true
//是否是中文
boolean hasChinese = Validator.hasChinese(“1212”);//false
//是否是数字
boolean hasNumber = Validator.hasNumber(“2314”);//true
//自定义正则然后验证(纯数字)
boolean matchRegex = Validator.isMatchRegex(“1*$”, “12”);//true
//异常验证(当不是中文时抛出异常)
//String s = Validator.validateChinese(“1212”, “内容非中文!”);
/字符串格式化/
String result1 = StrFormatter.format(“this is {} for {}”, “a”, “b”);//this is a for b
//转义{}
String result2 = StrFormatter.format(“this is \{} for {}”, “a”, “b”);//this is {} for a
//转义\
String result3 = StrFormatter.format(“this is \\{} for {}”, “a”, “b”);//this is \a for b
//树形结构
// 构建node列表
List<TreeNode> nodeList = CollUtil.newArrayList();
nodeList.add(new TreeNode<>(“1”, “0”, “系统管理”, 5));
nodeList.add(new TreeNode<>(“11”, “1”, “用户管理”, 222222));
nodeList.add(new TreeNode<>(“111”, “11”, “用户添加”, 0));
nodeList.add(new TreeNode<>(“2”, “0”, “店铺管理”, 1));
nodeList.add(new TreeNode<>(“21”, “2”, “商品管理”, 44));
nodeList.add(new TreeNode<>(“221”, “2”, “商品管理2”, 2));
// 0表示最顶层的id是0
List<Tree> treeList = TreeUtil.build(nodeList, “0”);
/*
[店铺管理[2]
商品管理2[221]
商品管理[21]
, 系统管理[1]
用户管理[11]
用户添加[111]
]
- */
Console.log(treeList);
集合包中封装了包括Enumeration、Iterator等的包装
3.5.1、集合工具-CollUtil
主要增加了对数组、集合类的操作
String[] col = new String[]{“a”, “b”, “c”, “d”, “e”};
//集合转换为字符串,是StrUtil.split()的反方法
List colList = CollUtil.newArrayList(col);
//给集合里追加一个元素
colList.add(“f”);
String str = CollUtil.join(colList, “#”); //a#b#c#d#e#f
//是否为空
boolean empty = colList.isEmpty();//false
//给定两个集合,然后两个集合中的元素一一对应,成为一个Map
Collection keys = CollUtil.newArrayList(“a”, “b”, “c”, “d”);
Collection values = CollUtil.newArrayList(1, 2, 3, 4);
Map<String, Integer> map = CollUtil.zip(keys, values);//{a=1, b=2, c=3, d=4}
3.5.2、列表工具-ListUtil
//获取满足指定规则所有的元素的位置
List a = ListUtil.toLinkedList(“1”, “2”, “3”, “4”, “3”, “2”, “1”);
int[] indexArray = ListUtil.indexOfAll(a, “1”::equals);//[0, 6]
//拆分(对集合按照指定长度分段,每一个段为单独的集合,返回这个集合的列表)
List<List> lists = ListUtil.split(Arrays.asList(1, 2, 3, 4), 2);//[[1, 2], [3, 4]]
//平均拆分
List<List> split = ListUtil.splitAvg(Arrays.asList(1, 2, 3, 4), 2);//[[1, 2], [3, 4]]
lists = ListUtil.splitAvg(Arrays.asList(1, 2, 3, 4), 3);//[[1, 2], [3], [4]]
//编辑元素
LinkedList strings = ListUtil.toLinkedList(“1”, “2”, “3”);
final List filter = (List) CollUtil.edit(strings, str1 -> “edit” + str1);//[edit1, edit2, edit3]
//列表截取
final List of = ListUtil.of(1, 2, 3, 4, 5, 6);//[1, 2, 3, 4, 5, 6]
//从索引为2开始截取到4
final List sub = ListUtil.sub(of, 2, 5);//[3, 4, 5]
// 对子列表操作不影响原列表
sub.remove(0);//[4, 5]
//反转
List reverse = ListUtil.reverse(strings);//[3, 2, 1]
//新建ArrayList
ArrayList stringss = ListUtil.toList(“21”,“都与偶i”,“dsf”,“欧赔”);
stringss.add(“二”);
stringss.add(“ewq”);
stringss.add(“换个”);//[21, 都与偶i, dsf, 欧赔, 二, ewq, 换个]
//根据汉字的拼音顺序排序
ListUtil.sortByPinyin(stringss);//[21, dsf, ewq, 都与偶i, 二, 换个, 欧赔]
//将对应List转换为不可修改的List
List unmodifiable = ListUtil.unmodifiable(stringss);
unmodifiable.remove(0);//报错不可修改
3.5.3、Iterator工具-IterUtil
//新建ArrayList
ArrayList arrayList = ListUtil.toList(null, “都与偶i”, “”, “欧赔”);
//获取列表的第一个元素
Object first = IterUtil.getFirst(arrayList);//null
//获取元素类型
Class<?> elementType = IterUtil.getElementType(arrayList);//class java.lang.String
//第一个非null
String firstNoneNull = IterUtil.getFirstNoneNull(arrayList);//都与偶i
//是否有null元素
boolean hasNull = IterUtil.hasNull(arrayList);//true
//是否全部为null
boolean allNull = IterUtil.isAllNull(arrayList);//false
//是否为null或者无元素
boolean empty1 = IterUtil.isEmpty(arrayList);//false
MapUtil是针对Map的一一列工具方法的封装,包括getXXX的快捷值转换方法
//快速创建多种类型的HashMap实例
HashMap<Object, Object> objectObjectHashMap = MapUtil.newHashMap(3, true);
objectObjectHashMap.put(“a”, “1”);
objectObjectHashMap.put(“b”, “2”);
objectObjectHashMap.put(“c”, “3”);
objectObjectHashMap.put(“d”, “4”);
//将一个或多个键值对加入到一个新建的Map中
Map<Object, Object> colorMap = MapUtil.of(new String[][]{{“RED”, “#FF0000”}, {“GREEN”, “#00FF00”}, {“BLUE”, “#0000FF”}});//{RED=#FF0000, GREEN=#00FF00, BLUE=#0000FF}
//是否为空
boolean empty = MapUtil.isEmpty(objectObjectHashMap);//false
//键值互换
Map<Object, Object> reverse = MapUtil.reverse(objectObjectHashMap);//{1=a, 2=b, 3=c, 4=d}
//获取指定类型的值
Object a = MapUtil.get(objectObjectHashMap, “c”, String.class);//3
/*
-
双查找功能–BiMap
-
要求key和value都不能重复(非强制要求)
-
如果key重复了,后加入的键值对会覆盖之前的键值对
-
如果value重复了,则会按照不确定的顺序覆盖key
-
HashMap无序(按照hash顺序),则谁覆盖谁和hash算法有关;
-
如果是LinkedHashMap,则有序,是后加入的覆盖先加入的
*/
BiMap<String, Integer> biMap = new BiMap<>(new HashMap<>());
biMap.put(“aaa”, 111);
biMap.put(“bbb”, 222);
Integer aaa = biMap.get(“aaa”);//111
String key = biMap.getKey(222);//bbb
/*可重复键值Map-TableMap
*通过键值单独建立List方式,使键值对一一对应,实现正向和反向两种查找
*数据越多越慢
*/
TableMap<String, Integer> tableMap = new TableMap<>(5);
tableMap.put(“aaa”, 111);
tableMap.put(“bbb”, 222);//TableMap{keys=[aaa, bbb], values=[111, 222]}
Integer aaa1 = tableMap.get(“aaa”);//111
String key1 = tableMap.getKey(222);//bbb
List aaa2 = tableMap.getValues(“aaa”);//[111]
List keys = tableMap.getKeys(111);//[aaa]
包含常用编码方式的编码和解码
3.7.1、Base62编码解码-Base62
Base62编码是由10个数字、26个大写英文字母和26个小写英文字母组成,多用于安全领域和短URL生成
/Base62编码解码-Base62/
String str = “http://www.hao123.com/net?3306”;
//编码
String encode = Base62.encode(str);//1S4kP7RyGjrqI1dXQYPlfpWeb3FlOwa6LpFnfBQta
//解码
String decodeStr = Base62.decodeStr(encode);//http://www.hao123.com/net?3306
3.7.2、Base64编码解码-Base64
Base64编码是用64(2的6次方)个ASCII字符来表示256(2的8次方)个ASCII字符,也就是三位二进制数组经过编码后变为四位的ASCII字符显示,长度比原来增加1/3
/Base64编码解码-Base64/
//编码
String encode1 = Base64.encode(str);//aHR0cDovL3d3dy5oYW8xMjMuY29tL25ldD8zMzA2
//解码
String decodeStr1 = Base64.decodeStr(encode1);//http://www.hao123.com/net?3306
3.7.3、回转N位密码-Rot
回转N位密码-Rot这里是回转13位是一种简易的置换暗码:下图是对照表
/回转N位密码-Rot(RotN(rotate by N places),回转N位密码,是一种简易的替换式密码)/
//编码(回转13位)
String encode13 = Rot.encode13(str);//uggc://jjj.unb456.pbz/arg?6639
// 解码
String decode13 = Rot.decode13(encode13);//http://www.hao123.com/net?3306
String str = “a, ,efedsfs, ddf”;
//参数:被切分字符串,分隔符逗号,0表示无限制分片数,去除两边空格,忽略空白项
List split = StrSplitter.split(str, ‘,’, 0, true, true);//[a, efedsfs, ddf]
//拆分以“/”分割
String str1 = “https://blog.csdn.net/weixin_42601136”;
List strings = StrSplitter.splitPath(str1,‘0’);//[https:, blog.csdn.net, weixin_42601136]
//长度为3,截取长度字符串
String[] strings1 = StrSplitter.splitByLength(str1, 3);//[htt, ps:, //b, log, .cs, dn., net, /we, ixi, n_4, 260, 113, 6]
//切分字符串,去除每个元素两边空格,忽略大小写
List strings2 = StrSplitter.splitTrimIgnoreCase(str, “,”, 0, true);//[a, efedDDsfs, ddf]
//切分字符串为字符串数组
String[] strings3 = StrSplitter.splitToArray(str, “,”, 0, true, true);//[a, efedDDsfs, ddf]
在Java中发送邮件主要品依靠javax.mail包,但是由于使用比较繁琐,因此Hutool针对其做了封装
3.9.1、引入依赖
com.sun.mail
javax.mail
1.6.2
3.9.2、实现
MailUtil.send参数:
- tos: 对方的邮箱地址,可以是单个,也可以是多个(Collection表示)
- subject:标题
- content:邮件正文,可以是文本,也可以是HTML内容
- isHtml: 是否为HTML,如果是,那参数3识别为HTML内容
- files: 可选:附件,可以为多个或没有,将File对象加在最后一个可变参数中即可
MailAccount account = new MailAccount();
//邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
account.setHost(“smtp.163.com”);
//邮件服务器的SMTP端口,可选,默认25
account.setPort(25);
//默认为true
account.setAuth(true);
//发件人(必须正确,否则发送失败)
account.setFrom(“XXXXXX@163.com”);
//用户名,默认为发件人邮箱前缀
account.setUser(“XXXXXX@163.com”);
//密码或者授权码
account.setPass(“XXXXXX”);
String send = null;
try {
//基础发送
send = MailUtil.send(account, “XXXXXX@qq.com”, “邮件标题”, “邮件内容”, false);
//发送HTML邮件并附带附件
send = MailUtil.send(account, “XXXXXX@qq.com”, “致敬立农”, “
测试邮件
”, true, FileUtil.file(“E:/PianAi/myNote/nn.txt”));//群法邮件
ArrayList tos = CollUtil.newArrayList(
“XXXXXX@qq.com”,
“XXXXXX@qq.com”);
send = MailUtil.send(account,tos, “邮件标题”, “邮件来自群发测试”, false);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(send);
注:
-
163邮箱是授权码不是登录密码
-
在发送时首先打开POP3/SMTP/IMAP
3.10.1、导入依赖
com.google.zxing
core
3.3.3
3.10.2、基础二维码
File generate = QrCodeUtil.generate(“https://blog.csdn.net/weixin_42601136”, 300, 300, FileUtil.file(“qrcode.jpg”));
3.10.3、自定义参数
QrConfig config = new QrConfig(300, 300);
// 设置边距,既二维码和背景之间的边距
config.setMargin(3);
// 设置前景色,既二维码颜色(青色)
config.setForeColor(Color.CYAN.getRGB());
// 设置背景色(灰色)
config.setBackColor(Color.GRAY.getRGB());
// 生成二维码到文件,也可以到流
File generate = QrCodeUtil.generate(“https://blog.csdn.net/weixin_42601136”, config, FileUtil.file(“qrcode.jpg”));
3.10.4、附带logo小图标
File generate = QrCodeUtil.generate(
“https://blog.csdn.net/weixin_42601136”, //二维码内容
QrConfig.create().setImg(“e:/111.jpg”), //附带logo
FileUtil.file(“qrcodeWithLogo.jpg”)//写出到的文件
);
3.10.5、调整纠错级别
纠错级别使用zxing的ErrorCorrectionLevel枚举封装,包括:L、M、Q、H几个参数,由低到高。
低级别的像素块更大,可以远距离识别,但是遮挡就会造成无法识别。高级别则相反,像素块小,允许遮挡一定范围,但是像素块更密集。
QrConfig qrConfig = new QrConfig();
//高级纠错
config.setErrorCorrection(ErrorCorrectionLevel.L);
File generate = QrCodeUtil.generate(“https://blog.csdn.net/weixin_42601136”, config, FileUtil.file(“qrcodeCustom.jpg”));
3.10.6、流的形式传给前端
写入response流中返回前端
/**
- 获取二维码
*/
最后总结
搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析
最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化
0.4、附带logo小图标
File generate = QrCodeUtil.generate(
“https://blog.csdn.net/weixin_42601136”, //二维码内容
QrConfig.create().setImg(“e:/111.jpg”), //附带logo
FileUtil.file(“qrcodeWithLogo.jpg”)//写出到的文件
);
3.10.5、调整纠错级别
纠错级别使用zxing的ErrorCorrectionLevel枚举封装,包括:L、M、Q、H几个参数,由低到高。
低级别的像素块更大,可以远距离识别,但是遮挡就会造成无法识别。高级别则相反,像素块小,允许遮挡一定范围,但是像素块更密集。
QrConfig qrConfig = new QrConfig();
//高级纠错
config.setErrorCorrection(ErrorCorrectionLevel.L);
File generate = QrCodeUtil.generate(“https://blog.csdn.net/weixin_42601136”, config, FileUtil.file(“qrcodeCustom.jpg”));
3.10.6、流的形式传给前端
写入response流中返回前端
/**
- 获取二维码
*/
最后总结
搞定算法,面试字节再不怕,有需要文章中分享的这些二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析
最后再分享一份终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化
[外链图片转存中…(img-Yw1P5x2s-1719257668005)]
0-9 ↩︎