enhance Console.log

This commit is contained in:
Looly 2020-09-11 19:16:33 +08:00
parent f1588a9c39
commit c0c71a5f8f
5 changed files with 196 additions and 69 deletions

View File

@ -3,11 +3,13 @@
-------------------------------------------------------------------------------------------------------------
# 5.4.3 (2020-09-10)
# 5.4.3 (2020-09-11)
### 新特性
* 【core 】 使用静态的of方法来new对象pr#177@Gitee
* 【setting】 Setting增加store无参方法issue#1072@Github
* 【setting】 StatementUtil增加null缓存pr#1076@Github
* 【core 】 扩充Console功能支持可变参数issue#1077@Github
### Bug修复

View File

@ -1,5 +1,6 @@
package cn.hutool.core.lang;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.StrUtil;
@ -11,14 +12,16 @@ import static java.lang.System.out;
/**
* 命令行控制台工具方法类<br>
* 此类主要针对{@link System#out} {@link System#err} 做封装
*
* @author Looly
*
* @author Looly
*/
public class Console {
private static final String TEMPLATE_VAR = "{}";
// --------------------------------------------------------------------------------- Log
/**
* System.out.println()方法打印控制台日志
*/
@ -29,79 +32,54 @@ public class Console {
/**
* System.out.println()方法打印控制台日志<br>
* 如果传入打印对象为{@link Throwable}对象那么同时打印堆栈
*
*
* @param obj 要打印的对象
*/
public static void log(Object obj) {
if (obj instanceof Throwable) {
Throwable e = (Throwable) obj;
final Throwable e = (Throwable) obj;
log(e, e.getMessage());
} else {
log("{}", obj);
log(TEMPLATE_VAR, obj);
}
}
/**
* System.out.print()方法打印控制台日志
*
* @param obj 要打印的对象
* @since 3.3.1
* System.out.println()方法打印控制台日志<br>
* 如果传入打印对象为{@link Throwable}对象那么同时打印堆栈
*
* @param otherObjs 要打印的对象
* @since 5.4.3
*/
public static void print(Object obj) {
print("{}", obj);
public static void log(Object obj1, Object... otherObjs) {
if(ArrayUtil.isEmpty(otherObjs)){
log(obj1);
} else{
log(buildTemplateSplitBySpace(otherObjs.length + 1), ArrayUtil.insert(otherObjs, 0, obj1));
}
}
/**
* 打印进度条
*
* @param showChar 进度条提示字符例如#
* @param len 打印长度
* @since 4.5.6
*/
public static void printProgress(char showChar, int len) {
print("{}{}", CharUtil.CR, StrUtil.repeat(showChar, len));
}
/**
* 打印进度条
*
* @param showChar 进度条提示字符例如#
* @param totalLen 总长度
* @param rate 总长度所占比取值0~1
* @since 4.5.6
*/
public static void printProgress(char showChar, int totalLen, double rate) {
Assert.isTrue(rate >= 0 && rate <= 1, "Rate must between 0 and 1 (both include)");
printProgress(showChar, (int) (totalLen * rate));
}
/**
* System.out.println()方法打印控制台日志
*
* System.out.println()方法打印控制台日志<br>
* 当传入template无"{}"被认为非模板直接打印多个参数以空格分隔
*
* @param template 文本模板被替换的部分用 {} 表示
* @param values
* @param values
*/
public static void log(String template, Object... values) {
log(null, template, values);
}
/**
* System.out.print()方法打印控制台日志
*
* @param template 文本模板被替换的部分用 {} 表示
* @param values
* @since 3.3.1
*/
public static void print(String template, Object... values) {
out.print(StrUtil.format(template, values));
if (ArrayUtil.isEmpty(values) || StrUtil.contains(template, TEMPLATE_VAR)) {
logInternal(template, values);
} else {
logInternal(buildTemplateSplitBySpace(values.length + 1), ArrayUtil.insert(values, 0, template));
}
}
/**
* System.out.println()方法打印控制台日志
*
* @param t 异常对象
*
* @param t 异常对象
* @param template 文本模板被替换的部分用 {} 表示
* @param values
* @param values
*/
public static void log(Throwable t, String template, Object... values) {
out.println(StrUtil.format(template, values));
@ -111,7 +89,95 @@ public class Console {
}
}
/**
* System.out.println()方法打印控制台日志
*
* @param template 文本模板被替换的部分用 {} 表示
* @param values
* @since 5.4.3
*/
private static void logInternal(String template, Object... values){
log(null, template, values);
}
// --------------------------------------------------------------------------------- print
/**
* System.out.print()方法打印控制台日志
*
* @param obj 要打印的对象
* @since 3.3.1
*/
public static void print(Object obj) {
print(TEMPLATE_VAR, obj);
}
/**
* System.out.println()方法打印控制台日志<br>
* 如果传入打印对象为{@link Throwable}对象那么同时打印堆栈
*
* @param otherObjs 要打印的对象
* @since 5.4.3
*/
public static void print(Object obj1, Object... otherObjs) {
if(ArrayUtil.isEmpty(otherObjs)){
print(obj1);
} else{
print(buildTemplateSplitBySpace(otherObjs.length + 1), ArrayUtil.insert(otherObjs, 0, obj1));
}
}
/**
* System.out.print()方法打印控制台日志
*
* @param template 文本模板被替换的部分用 {} 表示
* @param values
* @since 3.3.1
*/
public static void print(String template, Object... values) {
if (ArrayUtil.isEmpty(values) || StrUtil.contains(template, TEMPLATE_VAR)) {
printInternal(template, values);
} else {
printInternal(buildTemplateSplitBySpace(values.length + 1), ArrayUtil.insert(values, 0, template));
}
}
/**
* 打印进度条
*
* @param showChar 进度条提示字符例如#
* @param len 打印长度
* @since 4.5.6
*/
public static void printProgress(char showChar, int len) {
print("{}{}", CharUtil.CR, StrUtil.repeat(showChar, len));
}
/**
* 打印进度条
*
* @param showChar 进度条提示字符例如#
* @param totalLen 总长度
* @param rate 总长度所占比取值0~1
* @since 4.5.6
*/
public static void printProgress(char showChar, int totalLen, double rate) {
Assert.isTrue(rate >= 0 && rate <= 1, "Rate must between 0 and 1 (both include)");
printProgress(showChar, (int) (totalLen * rate));
}
/**
* System.out.println()方法打印控制台日志
*
* @param template 文本模板被替换的部分用 {} 表示
* @param values
* @since 5.4.3
*/
private static void printInternal(String template, Object... values){
out.print(StrUtil.format(template, values));
}
// --------------------------------------------------------------------------------- Error
/**
* System.err.println()方法打印控制台日志
*/
@ -121,7 +187,7 @@ public class Console {
/**
* System.err.println()方法打印控制台日志
*
*
* @param obj 要打印的对象
*/
public static void error(Object obj) {
@ -129,26 +195,45 @@ public class Console {
Throwable e = (Throwable) obj;
error(e, e.getMessage());
} else {
error("{}", obj);
error(TEMPLATE_VAR, obj);
}
}
/**
* System.out.println()方法打印控制台日志<br>
* 如果传入打印对象为{@link Throwable}对象那么同时打印堆栈
*
* @param otherObjs 要打印的对象
* @since 5.4.3
*/
public static void error(Object obj1, Object... otherObjs) {
if(ArrayUtil.isEmpty(otherObjs)){
error(obj1);
} else{
error(buildTemplateSplitBySpace(otherObjs.length + 1), ArrayUtil.insert(otherObjs, 0, obj1));
}
}
/**
* System.err.println()方法打印控制台日志
*
*
* @param template 文本模板被替换的部分用 {} 表示
* @param values
* @param values
*/
public static void error(String template, Object... values) {
error(null, template, values);
if (ArrayUtil.isEmpty(values) || StrUtil.contains(template, TEMPLATE_VAR)) {
errorInternal(template, values);
} else {
errorInternal(buildTemplateSplitBySpace(values.length + 1), ArrayUtil.insert(values, 0, template));
}
}
/**
* System.err.println()方法打印控制台日志
*
* @param t 异常对象
*
* @param t 异常对象
* @param template 文本模板被替换的部分用 {} 表示
* @param values
* @param values
*/
public static void error(Throwable t, String template, Object... values) {
err.println(StrUtil.format(template, values));
@ -158,10 +243,21 @@ public class Console {
}
}
/**
* System.err.println()方法打印控制台日志
*
* @param template 文本模板被替换的部分用 {} 表示
* @param values
*/
private static void errorInternal(String template, Object... values) {
error(null, template, values);
}
// --------------------------------------------------------------------------------- in
/**
* 创建从控制台读取内容的{@link Scanner}
*
*
* @return {@link Scanner}
* @since 3.3.1
*/
@ -171,7 +267,7 @@ public class Console {
/**
* 读取用户输入的内容在控制台敲回车前的内容
*
*
* @return 用户输入的内容
* @since 3.3.1
*/
@ -180,6 +276,7 @@ public class Console {
}
// --------------------------------------------------------------------------------- console lineNumber
/**
* 返回当前位置+行号 (不支持Lambda内部类递归内使用)
*
@ -193,7 +290,7 @@ public class Console {
final String methodName = stackTraceElement.getMethodName();
final String fileName = stackTraceElement.getFileName();
final Integer lineNumber = stackTraceElement.getLineNumber();
return String.format("%s.%s(%s:%s)", className,methodName,fileName,lineNumber);
return String.format("%s.%s(%s:%s)", className, methodName, fileName, lineNumber);
}
/**
@ -206,4 +303,14 @@ public class Console {
return new Throwable().getStackTrace()[1].getLineNumber();
}
/**
* 构建空格分隔的模板类似于"{} {} {} {}"
*
* @param count 变量数量
* @return 模板
*/
private static String buildTemplateSplitBySpace(int count){
return StrUtil.repeatAndJoin(TEMPLATE_VAR, count, StrUtil.SPACE);
}
}

View File

@ -123,7 +123,7 @@ public class RandomUtil {
}
/**
* 获得随机数[0, 2^32)
* 获得随机数int值
*
* @return 随机数
*/

View File

@ -21,6 +21,12 @@ public class ConsoleTest {
Console.log("This is Console log for {}.", "test");
}
@Test
public void logTest2(){
Console.log("a", "b", "c");
Console.log((Object) "a", "b", "c");
}
@Test
public void printTest(){
@ -29,6 +35,12 @@ public class ConsoleTest {
Console.log("This is Console print for {}.", "test");
}
@Test
public void printTest2(){
Console.print("a", "b", "c");
Console.print((Object) "a", "b", "c");
}
@Test
public void errorTest(){
@ -39,6 +51,12 @@ public class ConsoleTest {
Console.error("This is Console error for {}.", "test");
}
@Test
public void errorTest2(){
Console.error("a", "b", "c");
Console.error((Object) "a", "b", "c");
}
@Test
@Ignore

View File

@ -163,9 +163,9 @@ public class StatementUtil {
sql = sql.trim();
SqlLog.INSTANCE.log(sql, paramsBatch);
PreparedStatement ps = conn.prepareStatement(sql);
Map<Integer, Integer> nullTypeMap = new HashMap<>();
final Map<Integer, Integer> nullTypeMap = new HashMap<>();
for (Object[] params : paramsBatch) {
StatementUtil.fillParams(ps, params, nullTypeMap);
fillParams(ps, new ArrayIter<>(params), nullTypeMap);
ps.addBatch();
}
return ps;
@ -191,7 +191,7 @@ public class StatementUtil {
//null参数的类型缓存避免循环中重复获取类型
final Map<Integer, Integer> nullTypeMap = new HashMap<>();
for (Entity entity : entities) {
StatementUtil.fillParams(ps, CollectionUtil.valuesOfKeys(entity, fields), nullTypeMap);
fillParams(ps, CollectionUtil.valuesOfKeys(entity, fields), nullTypeMap);
ps.addBatch();
}
return ps;