精华内容
下载资源
问答
  • java——控制台输入打印图形
    千次阅读
    2021-03-14 21:44:05

    1. 打印直角三角形

    需求说明:从控制台输入直角三角形的高度(行数)。每行*的数目依次为1、3、5、7等

    实现思路:外层循环控制行数,根据用户输入的行数得到外层循环条件

    分析每行打印的内容:

    每一行均打印*号,第i行的*号数为2*i-1,从而得到内层循环条件代码如下:

    代码如下:

    import java.util.Scanner;

    publi cclass Three {

    public static void main(String[] args)

    {

    int rows = 0;

    Scanner input = new Scanner(System.in);

    System.out.println("请输入直角三角形的行数:");

    rows=input.nextInt();

    for(int i=0; i<=rows; i++){

    for(int j=0; j<2*i-1; j++){

    System.out.print("*");

    }

    System.out.println("");

    }

    }

    }

    2. 打印倒直角三角形

    需求说明:从控制台输入直角三角形的高度(行数)。每行*的数目从下至上依次为1、2、3、4等。

    实现思路:外层循环控制行数,根据用户输入的行数得到外层循环条件。分析每行打印的内容,每一行均打印*号,某一行与该行的*号数之和等于行数加1,从而得到内层循环条件。

    例如:用户从控制台输入的行数用rows表示,第几行用i表示,*号数用x表示,那么第i行就是:i+x=rows+1-----à*号数x=rows+1-i

    代码如下:

    import java.util.Scanner;

    public class Four {

    public static void main(String[] args){

    int rows=0;

    Scanner input = new Scanner(System.in);

    System.out.println("请输入直角三角形的行数:");

    rows=input.nextInt();

    for(int i=1; i<=rows; i++){

    for(int j=1; j<=rows+1-i; j++){

    System.out.print("*");

    }

    System.out.println("");

    }

    }

    }

    3. 打印等腰三角形

    需求说明:从控制台输入直角三角形的高度(行数)。每行*的数目依次为1、3、5、7等。

    实现思路:外层循环控制行数,根据用户输入的行数得到外层循环条件。

    分析每行打印的内容:每一行先打印空格,再打印*号。打印空格和打印*号用两个不同的for循环。为了清晰起见,下面我们以#号代替空格

    分析每行空格数、*号数和行数的关系:第i行的空格数与i之和等于用户从控制台输入的行数rows,第i行*号数为2*i-1,从而得到两个内层for循环的循环条件。

    例如:

    用户从控制台输入的行数用rows表示,第几行用i表示,空格数数用space表示,那么第i行就是:i+space=rows--------à空格数space=rows-i

    代码如下:

    import java.util.Scanner;

    public class Five {

    public static void main(String[] args) {

    int rows=0;

    Scanner input = new Scanner(System.in);

    System.out.println("请输入等腰三角形的行数:");

    rows=input.nextInt();

    for(int i=1; i<=rows; i++){

    for(int j=1; j<=rows-i; j++){

    System.out.print("#");

    }

    for(int k=1; k<=2*i-1; k++){

    System.out.print("*");

    }

    System.out.println("");

    }

    }

    }

    4. 打印菱形

    需求说明:从控制台输入菱形的高度(行数),如果用户输入的行数合法(奇数),则打印出菱形,否则提示用户输入奇数。

    实现分析:假设每行输入的行数为rows,则每行的*号数依次为1、3、5、7、......、rows、......、7、5、3、1

    实现思路:

    (1)利用while循环判断用户输入的是否为奇数。

    int rows=0;

    Scanner input = new Scanner(System.in);

    System.out.println("请输入菱形行数:");

    rows=input.nextInt();

    while(rows%2==0){

    System.out.println("请输入奇数:");

    rows=input.nextInt();

    }

    (2) 分步打印,先打印菱形的上半部分,即一个等腰三角形,行数为(rows+1)/2,可以

    得到外层循环和两个内层循环的循环条件。

    int n=(rows+1)/2;

    for(int i=1;i<=n;i++){

    for(int j=1; j<=n-i; j++){

    System.out.print(" ");

    }

    for(int k=1; k<=2*i-1; k++){

    System.out.print("*");

    }

    System.out.print("\n");

    }

    (3)打印菱形的下半部分,打印完一行后换行

    for(int i=n-1; i>=1; i--){

    for(int j=0; j

    System.out.print(" ");

    }

    for(int k=0; k<2*i-1; k++){

    System.out.print("*");

    }

    System.out.print("\n");

    }

    完整代码如下:

    import java.util.Scanner;

    public class Six {

    public static void main(String[] args) {

    int rows=0;

    Scanner input = new Scanner(System.in);

    System.out.println("请输入菱形行数:");

    rows=input.nextInt();

    while(rows%2==0){

    System.out.println("请输入奇数:");

    rows=input.nextInt();

    }

    int n=(rows+1)/2;

    for(int i=1;i<=n;i++){

    for(int j=1; j<=n-i; j++){

    System.out.print(" ");

    }

    for(int k=1; k<=2*i-1; k++){

    System.out.print("*");

    }

    System.out.print("\n");

    }

    for(int i=n-1; i>=1; i--){

    for(int j=0; j

    System.out.print(" ");

    }

    for(int k=0; k<2*i-1; k++){

    System.out.print("*");

    }

    System.out.print("\n");

    }

    }

    }

    更多相关内容
  • Java 控制台 打印表格 可前往http://blog.csdn.net/j506825719/article/details/78996659查看效果图后再决定是否需要下载。
  • 以下是 用java编程,在控制台打印日历PrintDate.java文件内容如下,复制直接可用:package com.itjob.printdate;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; ...

    以下是 用java编程,在控制台打印日历##

    PrintDate.java文件内容如下,复制直接可用:

    package com.liuzh.printdate;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Scanner;
    
    public class PrintDate {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner input = new Scanner(System.in);
    		System.out.println("请输入一个日期,如2017-08");
    		String sDate = input.next();
    		
    		Date date = null;
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
    		
    		try{
    			date = sdf.parse(sDate);
    		} catch (ParseException e) {
    			e.printStackTrace();
    		}
    		
    		printDate(date);
    	}
    
    	//打印日历
    	private static void printDate(Date date){
    		int[] a= {0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年每月天数
    		int[] b= {0,31,28,31,30,31,30,31,31,30,31,30,31};//平年每月天数
    		int sumDays = 0;
    		int sumDays1 = 0;
    		int year = date.getYear() + 1900;
    		int month = date.getMonth() + 1;
    		int day = date.getDay(); // 当前月第一天是星期几
    		int count = 0;
    		
    		
    		if (isLeaPYear(year)) {
    			sumDays = a[month];
    			if(month==1){
    				if(isLeaPYear(year--)){
    					sumDays1 = a[12];
    				}else{
    					sumDays1 = b[12];
    				}
    			}else{
    				sumDays1 = a[month-1];
    			}
    		}else{
    			sumDays = b[month];
    			if(month==1){
    				if(isLeaPYear(year--)){
    					sumDays1 = a[12];
    				}else{
    					sumDays1 = b[12];
    				}
    			}else{
    				sumDays1 = b[month-1];
    			}
    		}
    		
    		System.out.println("\n\n日\t一\t二\t三\t四\t五\t六");
    		System.out.println("---------------------------------------------------");
    		//打印对应星期的天数
    		for (int i = day-1; i >= 0; i--) {
    			System.out.print("(" + (sumDays1 - i) +")" + "\t");
    			count++;
    			if (count == 7) {
    				System.out.println();
    				count = 0;
    			}
    		}
    		//每月前面的缺省
    		for (int i = 1; i <= sumDays; i++) {
    			System.out.print(i + "\t");
    			count++;
    			if (count == 7) {
    				System.out.println();
    				count = 0;
    			}
    		}
    		//每月后面的缺省
    		if (count!=0) {
    			for (int i = 1; i <= 7-count; i++) {
    				System.out.print("(" + i +")" + "\t");
    			}
    		}
    		
    		
    	}
    	
    	
    	//判断是否为闰年
    	private static boolean isLeaPYear(int year){
    		if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
    			return true;
    		}else{
    			return false;
    		}
    	}
    
    }
    
    

    运行结果如下:
    这里写图片描述

    感谢您的阅读,欢迎参观我的个人网站:闲乐小站【www.xianlewang.cn】

    展开全文
  • java实现控制台打印表格】

    千次阅读 2020-11-12 17:20:30
    我的实现思路:使用jdbc连接目标服务器,并执行一条给定的sql语句,能够连接成功则在控制台输出执行结果,连接失败则打印异常信息。 实现该功能的过程中,对我来说最麻烦的是要在控制台输出表格,难点在于表格列宽...

    背景

    判断给定数据库是否可以连接,习惯做法是安装一个客户端,输入连接信息后连接测试。但是客户现场通常只提供一个linux系统,没有相关客户端。因此,需要一个能在linux上运行的数据库连接测试工具。我的实现思路:使用jdbc连接目标服务器,并执行一条给定的sql语句,能够连接成功则在控制台输出执行结果,连接失败则打印异常信息。
    在实现该功能的过程中,对我来说最麻烦的是要在控制台输出表格,难点在于控制表格列宽相等(涉及中英文长度不一致)以及表格内容要居中对齐

    效果

    最终实现效果如下:
    在这里插入图片描述

    核心代码分享

    分享此内容的目的有二:

    1. 为要实现同样功能的童鞋提供参考
    2. 请大佬们从实现思路或者具体方法上指点一下是否有更佳实现方式

    主要写了一个PrintTable类:
    在这里插入图片描述

    定义了一个Table内部类,实现以下方法:

    1. buildTable(List<List< String>> content): 传入二维list,构建表格
    2. getLimitTable():限制宽度,最大条数后的表格
    3. getMaxWidthLenList(Table table):得到表格的每列最大宽度,用于实现列宽相等
    4. getFormatTable(Table table, String symbol):根据指定分隔符得到最终格式化后的表格
    5. printTable(String… symbols):打印表格,指定分隔符

    PrintTable:

    package com.sw.utils;
    
    import lombok.Data;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.concurrent.atomic.AtomicInteger;
    import java.util.stream.Collectors;
    
    @Data
    public class PrintTable {
    
        private Table table;
        //最大列宽:sql查询结果某列内容可能过大,不想完全显示,因此限制最大列宽
        private Integer maxWidth;
        //最大条数:sql查询结果可能有非常多,通常不必完全显示,因此限制最大条数
        private Integer maxLength;
    
        public PrintTable(List<List<String>> content, Integer maxWidth, Integer maxLength) {
            this.table = buildTable(content);
            this.maxLength = maxLength;
            this.maxWidth = maxWidth;
        }
    
    
        public PrintTable(List<List<String>> content) {
            this.table = buildTable(content);
            this.maxLength = 10;
            this.maxWidth = 40;
        }
    
        /**
         * 创建Table实例
         *
         * @param content
         * @return
         */
    
        private Table buildTable(List<List<String>> content) {
            return new Table(content);
        }
    
        /**
         * 打印表格
         */
        public void printTable(String... symbols) {
            String symbol = symbols.length == 0 ? "|" : symbols[0];
            //按照最大列宽、最大数据量过滤后的表格
            Table limitTable = getLimitTable();
            //设置表格的最大宽度:得到每列宽度,再求和
            List<Integer> originMaxWidthList = getMaxWidthLenList(limitTable);
            limitTable.setMaxWidthList(originMaxWidthList);
    
            //得到格式化后的表格数据
            Table formatTable = getFormatTable(limitTable, symbol);
            Integer totalColSize = formatTable.getTotalColSize();
            //打印首行分割符号
            System.out.println(StringUtils.getRepeatChar("-", totalColSize));
            formatTable.getContent()
                    .forEach(row -> {
                        row.forEach(System.out::print);
                        System.out.println();
                        //打印每行分割符号
                        System.out.println(StringUtils.getRepeatChar("-", totalColSize));
                    });
        }
    
    
        /**
         * 格式化表格
         *
         * @param symbol 定义每列间隔符号
         * @return
         */
        private Table getFormatTable(Table table, String symbol) {
            //获取原表每列最大宽度
            List<Integer> originMaxWidthList = table.getMaxWidthList();
            //除了间隔符号外,固定在每个单元格前后加两个空格
            int symbolLen = symbol.length() + 2;
            //遍历原table,将每个单元格填充到该列最大长度
            List<List<String>> formatList = table.getContent().stream().map(
                    row -> {
                        //用于流在遍历每行的过程中,获取列序号
                        AtomicInteger atomicInteger = new AtomicInteger(0);
                        return row.stream().map(cell -> {
                            //当前遍历的列序号
                            int j = atomicInteger.getAndIncrement();
                            //原表该列的最大宽度+间隔符号宽度-双字节出现的次数
                            int cellSize = originMaxWidthList.get(j) + symbolLen - StringUtils.getZHCharCount(cell);
                            //如果是首行,还需要再前面加一个分割符号|,故长度加1
                            cellSize = j == 0 ? cellSize + 1 : cellSize;
                            //返回原始字符串按照指定symbol填充到指定长度cellSize,并居中对齐的字符
                            return StringUtils.getPadString(cell, cellSize, symbol, j);
                        }).collect(Collectors.toList());
                    }
            ).collect(Collectors.toList());
            //存储格式化后的表格数据
            Table formatTable = buildTable(formatList);
            //设置格式化表格的总宽度:原始宽度+自定义分割符号的总宽度(列数*符号宽度)+首列前面的符号宽度
            int totalColSize = table.getTotalColSize() + table.getColCount() * symbolLen + 1;
            formatTable.setTotalColSize(totalColSize);
            return formatTable;
        }
    
     	/**
         * @return 获取经过条件过滤的表格
         */
        private Table getLimitTable() {
            List<List<String>> limitContent = table.getContent().stream()
                    .limit(maxLength)
                    .map(row -> row.stream()
                    	//去除内容中含制表符时对结果展示的影响
                            .map(cell -> cell == null ? null : cell.replaceAll("\t", " "))
                            .map(cell -> cell != null && cell.length() > maxWidth ? cell.substring(0, maxWidth) : cell)
                            .collect(Collectors.toList())
                    ).collect(Collectors.toList());
            return buildTable(limitContent);
        }
    
        /**
         * 计算table每行的最大宽度
         * 要使列宽相等,就需要将每个单元格宽度设置为该列最大宽度,二计算每行最大宽度相对容易些
         * 故将content转置后得到的每行最大宽度即为所求
         * 需要考虑单双字节的情况,比如有数组arr:{"aabb","sql表格","编程学习"},
         * 按照String.length计算,arr[1]最长,但是实际上arr[2]看起来才是最宽的
         * 因此计算宽度时,将双字节字符看做2个单位长度,即:每出现一个双字节字符,长度+1
         *
         * @return
         */
        private List<Integer> getMaxWidthLenList(Table table) {
            //得到转置数组每个元素的长度,一个中文算两个长度
            return Arrays.stream(table.transpose())
                    .map(rows -> Arrays.stream(rows)
                            .mapToInt(s -> {
                                //sql查询结果如果为null,则认为长度为4
                                if (s == null) {
                                    return 4;
                                } else {
                                    //加上双字节字符出现的次数,最短为null,四个字符
                                    return s.length() + StringUtils.getZHCharCount(s);
                                }
                            }).max().orElse(0)
                    ).collect(Collectors.toList());
        }
    
        @Data
        private class Table {
            /**
             * 表格内容(含表头)
             */
            private List<List<String>> content = new ArrayList<>();
    
            /**
             * 表格列总字符长度:便于打印行分割符号
             */
            private Integer totalColSize;
            /**
             * 每列最大宽度
             */
            private List<Integer> maxWidthList;
    
    
            Integer getTotalColSize() {
                if (totalColSize == null && maxWidthList != null && maxWidthList.size() != 0) {
                    this.totalColSize = maxWidthList.stream().reduce(Integer::sum).get();
                }
                return totalColSize;
            }
    
            //private限制只能通过外部类构造
            private Table(List<List<String>> content) {
                this.content = content;
            }
    
            //获取表格行数
            int getRowCount() {
                return content.size();
            }
    
            //获取表格列数,0行代表表头,默认认为content中至少含有表头
            int getColCount() {
                return content.get(0).size();
            }
    
            /**
             * 转置二维数组
             *
             * @return
             */
            private String[][] transpose() {
                int rowCount = getRowCount();
                int colCount = getColCount();
                String[][] result = new String[colCount][rowCount];
    
                for (int i = 0; i < rowCount; i++) {
                    for (int j = 0; j < colCount; j++) {
                        result[j][i] = content.get(i).get(j);
                    }
                }
                return result;
            }
        }
    
    }
    
    

    用到的工具类:StringUtils

    package com.sw.utils;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import java.util.stream.IntStream;
    
    public class StringUtils {
    
        /**
         * 判断字符串是否为空
         *
         * @param str
         * @return
         */
        public static boolean isEmpty(String str) {
            return str == null || "".equals(str);
        }
    
        /**
         * 将content按照正则匹配,返回可以匹配的字符串列表
         *
         * @param reg
         * @param content
         * @return
         */
        public static List<String> extractMessage(String reg, String content) {
            Pattern compile = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
            Matcher matcher = compile.matcher(content);
            List<String> list = new ArrayList<>();
            while (matcher.find()) {
                list.add(matcher.group());
            }
            return list;
        }
    
    
        /**
         * 将str重复count次,返回结果
         *
         * @param str
         * @param count
         * @return
         */
        public static String getRepeatChar(String str, int count) {
            StringBuilder res = new StringBuilder();
            IntStream.range(0, count).forEach(i -> res.append(str));
            return res.toString();
        }
    
        /**
         * 将字符串填充到指定长度并居中对齐
         *
         * @param str
         * @param len
         * @return
         */
        public static String getPadString(String str, Integer len) {
            StringBuilder res = new StringBuilder();
            str = str.trim();
            if (str.length() < len) {
                int diff = len - str.length();
                int fixLen = diff / 2;
                String fix = getRepeatChar(" ", fixLen);
                res.append(fix).append(str).append(fix);
                if (res.length() > len) {
                    return res.substring(0, len);
                } else {
                    res.append(getRepeatChar(" ", len - res.length()));
                    return res.toString();
                }
            }
            return str.substring(0, len);
        }
    
        /**
         * 此方法主要为表格的单元格数据按照指定长度填充并居中对齐并带上分割符号
         *
         * @param str    原始字符串
         * @param len    输出字符串的总长度
         * @param symbol 分割符号
         * @param index  传入的cell在list的索引,如果为第一个则需要在前面增加分割符号
         * @return
         */
        public static String getPadString(String str, Integer len, String symbol, int index) {
            String origin = str + "  ";
            if (index == 0) {
                String tmp = getPadString(origin, len - 2);
                return symbol + tmp + symbol;
            } else {
    
                String tmp = getPadString(origin, len - 1);
                return tmp + symbol;
            }
        }
    
        /**
         * 得到一个字符串中单字节出现的次数
         *
         * @param cell
         * @return
         */
        public static Integer getENCharCount(String cell) {
            if (cell == null) {
                return 0;
            }
            String reg = "[^\t\\x00-\\xff]";
    //        String reg = "|[^\t\\x00-\\xff]";
            return cell.replaceAll(reg, "").length();
        }
    
        /**
         * 得到制表符长度,每个\t显示四个长度
         *
         * @param cell
         * @return
         */
        public static Integer getTableCount(String cell) {
            if (cell == null) {
                return 0;
            }
            String reg = "\t";
    //        String reg = "|[^\t\\x00-\\xff]";
            return cell.length() - cell.replaceAll(reg, "").length();
        }
    
        /**
         * 得到一个字符串中双字节出现的次数
         *
         * @param cell
         * @return
         */
        public static Integer getZHCharCount(String cell) {
            if (cell == null) {
                return 0;
            }
            return cell.length() - getENCharCount(cell);
        }
    
        public static void main(String[] args) {
            String test = "ab\t哈哈嘻嘻";
            String reg = "[^\t\\x00-\\xff]";
            System.out.println(test.replaceAll(reg, "").length());
            test.replaceAll("\t|[^\\x00-\\xff]", "");
            System.out.println(test.length());
            System.out.println(StringUtils.getZHCharCount(test));
            System.out.println(StringUtils.getENCharCount(test));
        }
    }
    
    

    调用方法:
    将sql得到的rsultSet封装成二维list,再调用PrintTable即可完成控制台打印
    在这里插入图片描述

    展开全文
  • 将对象通过console打印成表格样式(类似控制台mysql查询) 支持list,List<Object> ,Object[],Iterator,Object等,不支持如:List<Integer> 等泛型为基本数据类型的集合。
  • 平时为了方便测试和定位错误(特别是demo工具时),又不想依赖日志框架,习惯使用System.out.println(),但这种知识简单输出文本,而且打印异常时不好定位,对打印不同级别的日志也不能满足需求。本文对System.out....

    平时为了方便测试和定位错误(特别是demo工具时),又不想依赖日志框架,习惯使用System.out.println(),但这种知识简单输出文本,而且打印异常时不好定位,对打印不同级别的日志也不能满足需求。本文对System.out.println()进行简单封装,轻量级调用。

    以前这样打印日志:

     public static void main(String[] args) {
    
            testLogPrintBefore();
    
        }
    
        private static void testLogPrintBefore() {
            System.out.println("hello world!");
            try {
                LogTest logTest = null;
                logTest.clone();
            } catch (Exception e) {
                System.out.println("发生了一个错:" + e.getMessage());
            }
    
        }
    

    输出:

    hello world!
    发生了一个错:null
    

    可以看出非常不直观,只是简单输出文本,定位错误不好。

    使用ConsoleUtils之后:

      public static void main(String[] args) {
    
        testLogPrintAfter();
    
    }
    
    private static void testLogPrintAfter() {
    
        ConsoleUtils.d("hello world!");
        ConsoleUtils.i("hello world!");
        ConsoleUtils.w("hello world!");
    
        try {
            LogTest logTest = null;
            logTest.clone();
        } catch (Exception e) {
            ConsoleUtils.w("发生了一个错误", e);
        }
    
        ConsoleUtils.e("hello world!");
        ConsoleUtils.e("hello world!", new RuntimeException("发生了一个错误"));
        try {
            Class.forName("java.util.Test");
        } catch (ClassNotFoundException ignored) {
            ConsoleUtils.e("hello world!", ignored);
        }
    }
    

    输出:

    2021-08-12 17:20:587/D:testLogPrintAfter(LogTest.java:24)hello world!  ---->Thread:main
    2021-08-12 17:20:605/I:testLogPrintAfter(LogTest.java:25)hello world!  ---->Thread:main
    2021-08-12 17:20:605/W:testLogPrintAfter(LogTest.java:26)hello world!  ---->Thread:main
    2021-08-12 17:20:606/W:testLogPrintAfter(LogTest.java:32)发生了一个错误  ---->Thread:main
    java.lang.NullPointerException
    	at com.sjl.socket.demo.LogTest.testLogPrintAfter(LogTest.java:30)
    	at com.sjl.socket.demo.LogTest.main(LogTest.java:18)
    
    2021-08-12 17:20:606/E:testLogPrintAfter(LogTest.java:35)hello world!  ---->Thread:main
    2021-08-12 17:20:606/E:testLogPrintAfter(LogTest.java:36)hello world!  ---->Thread:main
    java.lang.RuntimeException: 发生了一个错误
    	at com.sjl.socket.demo.LogTest.testLogPrintAfter(LogTest.java:36)
    	at com.sjl.socket.demo.LogTest.main(LogTest.java:18)
    
    2021-08-12 17:20:607/E:testLogPrintAfter(LogTest.java:40)hello world!  ---->Thread:main
    java.lang.ClassNotFoundException: java.util.Test
    	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    	at java.lang.Class.forName0(Native Method)
    	at java.lang.Class.forName(Class.java:264)
    	at com.sjl.socket.demo.LogTest.testLogPrintAfter(LogTest.java:38)
    	at com.sjl.socket.demo.LogTest.main(LogTest.java:18)
    

    上面虽然信息多了,日志定位信息时非常明了,输出了日志时间、日志级别、调用方法,定位行、描述信息,非常适合平时做一些测试之类工作的日志打印

    ConsoleUtils是基于System.out.println封装,不同级别日志没有特别明显的颜色区分。这里介绍一个辅助插件,Grep Console是一款和IDEA Console相关的插件(当然也适用Android)。可以通过expression表达式过滤日志、给不同级别的日志或者给不同pattern的日志加上背景色与前景色。

    Grep Console可以IDEA Setting->Plugin界面,搜索Grep安装即可

    上面使用Grep Console插件后,输出效果如下:
    在这里插入图片描述

    可见,有颜色之后,区分非常明了

    Grep Console配置截图:

    在这里插入图片描述

    最后国际规则,贴上ConsoleUtils的完整代码:

    /**
     * 控制台日志工具类
     *
     * @author Kelly
     * @version 1.0.0
     * @filename ConsoleUtils
     * @time 2021/8/11 11:24
     * @copyright(C) 2021 song
     */
    public class ConsoleUtils {
    
        private static final int LOG_DEBUG = 1;
        private static final int LOG_INFO = 2;
        private static final int LOG_WARN = 3;
        private static final int LOG_ERROR = 4;
        private static final int PLATFORM_ANDROID = 0;
        private static final int PLATFORM_PC = 1;
    
        /**
         * 是否显示日志
         */
        private static boolean debug = true;
    
    
        public static void d(Object msg) {
            printLog(LOG_DEBUG, msg, null);
        }
    
    
        public static void i(Object msg) {
            printLog(LOG_INFO, msg, null);
        }
    
    
        public static void w(Object msg) {
            printLog(LOG_WARN, msg, null);
        }
    
    
        public static void w(Object msg, Throwable tr) {
            printLog(LOG_WARN, msg, tr);
        }
    
        public static void e(Object msg) {
            printLog(LOG_ERROR, msg, null);
        }
    
        public static void e(Object msg, Throwable tr) {
            printLog(LOG_ERROR, msg, tr);
        }
    
        /**
         * 打印日志
         *
         * @param type
         * @param msgObj
         * @param tr
         * @return
         */
        private static int printLog(int type, Object msgObj, Throwable tr) {
            if (!debug) {
                return -1;
            }
            String level = "--";
            switch (type) {
                case LOG_DEBUG:
                    level = "D";
                    break;
                case LOG_INFO:
                    level = "I";
                    break;
                case LOG_WARN:
                    level = "W";
                    break;
                case LOG_ERROR:
                    level = "E";
                    break;
            }
            int platformFlag = checkPlatform();
            String content = createLog(msgObj.toString(), platformFlag) + (tr != null ? ('\n' + getStackTraceString(tr)) : "");
            StringBuilder sb = new StringBuilder();
            String formatDate = getFormatTime();
            if (platformFlag == PLATFORM_ANDROID) {
                sb.append(content);
            } else {
                sb.append(formatDate).append("/").append(level).append(":").append(content);
            }
    
            System.out.println(sb.toString());
            return 0;
        }
    
        /**
         * 创建日志定位信息
         *
         * @param msg
         * @param platformFlag
         * @return
         */
        private static String createLog(String msg, int platformFlag) {
            StringBuilder builder = new StringBuilder();
            try {
                Thread thread = Thread.currentThread();
                int stackTraceIndex;
                if (platformFlag == PLATFORM_ANDROID) { //这里根据把ConsoleUtils所在的位置确认,可以打个断点确认
                    stackTraceIndex = 5;
                } else {
                    stackTraceIndex = 4;
                }
                StackTraceElement[] stackTrace = thread.getStackTrace();
                String className = stackTrace[stackTraceIndex].getFileName();
                String methodName = stackTrace[stackTraceIndex].getMethodName();
                int lineNumber = stackTrace[stackTraceIndex].getLineNumber();
                builder.append(methodName);
                builder.append("(").append(className).append(":").append(lineNumber).append(")");
                builder.append(msg);
                builder.append("  ---->").append("Thread:").append(thread.getName());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return builder.toString();
        }
    
        private static int checkPlatform() {
            try {
                Class.forName("android.os.Build");
                return PLATFORM_ANDROID;
            } catch (ClassNotFoundException ignored) {
                return PLATFORM_PC;
            }
        }
    
        /**
         * 获取日志异常栈信息
         *
         * @param tr
         * @return
         */
        public static String getStackTraceString(Throwable tr) {
            if (tr == null) {
                return "";
            }
            Throwable t = tr;
            while (t != null) {
                if (t instanceof UnknownHostException) {
                    return "";
                }
                t = t.getCause();
            }
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw, false);
            tr.printStackTrace(pw);
            pw.flush();
            pw.close();
            return sw.toString();
        }
    
        private static String getFormatTime() {
            Date date = new Date();
            String strDateFormat = "yyyy-MM-dd mm:ss:SSS";
            SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat);
            return sdf.format(date);
        }
    }
    
    展开全文
  • I have tried the suggestion here By doing this import java.io.FileOutputStream; import java.io.PrintStream; public class Compiler { public static void main(String args[]){ try { Parse parser = new ...
  • Java 控制台打印时间

    2020-12-16 17:58:27
    打印时间输出下面样子到控制台: * ****** * * * * * ****** * * *** * * * *** * * * * * *** * * * *** * * * * * ****** * ****** ****** *
  • 在执行sql的时候将数据库连接地址打印在控制台,应该怎么配置?
  • JAVA在控制台打印表格的工具类,链式调用,注释齐全。 支持自定义:表格对齐方式、是否等宽、左右边距、水平垂直交叉空白填充符,打印数据格式支持: Object[][] List《Object[]》 List《List《Object》》 List...
  • java代码-控制台打印正三角形和倒三角形
  • cmd调用java程序,cmd控制台打印出彩色文字以下仅为本人工作、学习过程中所接触到的内容,不足之处请多包涵。测试环境:win7专业版的DOS使用cmd调用java程序时,cmd控制台打印出来的效果默认都是黑底白字,打印...
  • 主要为大家详细介绍了java控制台打印本月的日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 在java控制台中看到的sql日志通常是如下的样子, Preparing: SELECT in (0,1) ORDER BY i.UPDATE_DATE_TIME DESC 2019-01-18 10:12:52,566 [DEBUG](org.apache.ibatis.logging.log4j.Log4jImpl.debug(Log4jImpl....
  • System.err.println(object);
  • 1.socket 编程控制台没有数据打印 2.打印中文乱码问题 3.附录:完整测试代码 1.socket 编程控制台没有数据打印 程序运行之前要注意一点,就是server端的测试方法要先让他跑起来。因为只有服务端跑起来才能接收...
  • Java打印表格 Console/控制台

    千次阅读 2020-09-14 11:18:46
    功能: 控制台打印表格,支持字段动态长度,左对齐,设置最多打印多少行。 更多代码请参考具体类,下载链接:[https://download.csdn.net/download/qq_26599807/12840079]
  • 功能:控制台打印表格,支持字段动态长度,左对齐,右对齐,居中,设置最大列长,设置列间隔符,设置最多打印多少行。类下载地址:http://download..net/download/j506825719/10211082简单使用方法:new的时候,给定...
  • Java在控制台打印本月日历 学习《Java核心技术卷I·基础知识》第10版 的时候里面有一个小例子,就是控制台上打印日历的一个例子,就像自己试试。 代码如下: import java.time.LocalDate; public class ...
  • Java获取时间打印控制台代码实例

    千次阅读 2021-02-12 23:41:26
    这篇文章主要介绍了Java获取时间打印控制台代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下面试时有一道面试题:要求获取当时时间,并像电子手表那样...
  • Java 在控制台上用*输出圆(详解)

    千次阅读 2019-09-10 12:45:46
    查询Math类的方法,打印出如右所示的近似圆,只要给定不同半径,圆的大小就会随之发生改变。 public class JinSiYuan { public static void main(String[] args) { Scanner scanner = new Scanner(System.in);...
  • 使用log4j在控制台打印sql入门案例,结合Mybatis的入门案例!
  • 本地cmd命令, 输入命令, 并在控制台输出命令执行结果 jsch 远程ssh到linux服务器, 执行结果并显示输出
  • 使用Graphic打印出字符,而后读取其中的像素,再进行打印,只要是字库中有的字符,都可以将其放大并打印
  • 【mybatis在控制台打印sql语句配置】

    千次阅读 2021-03-09 17:15:56
    [%c] [%p] - %m%n #FilePath = /opt/uploads/maven_logs/maven_web.log ######################################################################### #将 Mybatis log4j运行级别调到DEBUG可以在控制台打印出...
  • 主要介绍了java控制台输出百分比进度条示例,需要的朋友可以参考下
  • JAVA控制台输出格式

    2021-04-24 02:13:16
    表示用第n个参数 } } 输出结果如下: +3.140 +3.140 0003.140 (3.140) 123,456.780000 2a3b 0x2a3b 老板:您名字ajioy,年龄: 21岁, 老板:您名字ajioy,年龄:0x26岁 注意:console下的输出实际开发中并不常用,...
  • 控制台打印红黑树.rar

    2021-05-17 10:29:35
    控制台打印红黑树
  • java类,对象实现杨辉三角在控制台的输出

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 156,714
精华内容 62,685
关键字:

java在控制台打印

java 订阅