JAVA控制台输入(Scanner)及输出颜色「终于解决」

Java (60) 2023-07-27 12:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说JAVA控制台输入(Scanner)及输出颜色「终于解决」,希望能够帮助你!!!。

这里介绍如何控制java控制台输入输出内容的颜色。

1. 控制台输入(Scanner)

java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。

    public static void main(String[] args) {
        //创建一个扫描器对象,用于接收键盘数据
        Scanner scanner = new Scanner(System.in);
        //next方式接收字符串(不可以接收空格)
        System.out.println("Next方式接收:");
        //判断用户还有没有输入字符
        if (scanner.hasNext()) {
            String str = scanner.next();
            System.out.println("输入内容:" + str);
        }
        // 凡是属于IO流的类如果不关闭会一直占用资源.要养成好习惯用完就关掉.
        // 就好像你接水完了要关 水龙头一样.很多下载软件或者视频软件如果你不彻底关,
        // 都会自己上传下载从而占用资源,你就会觉得 卡,这一个道理.
        scanner.close();
    }
JAVA控制台输入(Scanner)及输出颜色「终于解决」_https://bianchenghao6.com/blog_Java_第1张

接下来我们使用另一个方法来接收数据:nextLine()

public static void main(String[] args) {
        //创建一个扫描器对象,用于接收键盘数据
        Scanner scanner = new Scanner(System.in);
        //nextLine方式接收字符串(可以接收空格)
        System.out.println("NextLine方式接收:");
        //判断用户还有没有输入字符
        if (scanner.hasNextLine()) {
            String str = scanner.nextLine();
            System.out.println("输入内容:" + str);
        }
        // 凡是属于IO流的类如果不关闭会一直占用资源.要养成好习惯用完就关掉.
        // 就好像你接水完了要关 水龙头一样.很多下载软件或者视频软件如果你不彻底关,
        // 都会自己上传下载从而占用资源,你就会觉得 卡,这一个道理.
        scanner.close();
    }
JAVA控制台输入(Scanner)及输出颜色「终于解决」_https://bianchenghao6.com/blog_Java_第2张

next 和 nextLine的区别

next():

一定要读取到有效字符后才可以结束输入。

对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。

只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。

next() 不能得到带有空格的字符串。

nextLine():

以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。

可以获得空白。

2、java控制台输出颜色控制

在java语言中,可以通过\033特殊转义字符实现输出格式控制,如下是一个例子。



public class MYJ2CTestOutputControl {
    /**
     * 通过\033特殊转义字符实现输出格式控制     * @param content, 待格式化的内容
     * @param fontColor, 字体颜色:30黑 31红 32绿 33黄 34蓝 35紫 36深绿 37白
     * @param fontType, 字体格式:0重置 1加粗 2减弱 3斜体 4下划线 5慢速闪烁 6快速闪烁
     * @param backgroundColor, 字背景颜色:40黑 41红 42绿 43黄 44蓝 45紫 46深绿 47白
     * */    
    public static String getFormatOutputString(String content, int fontColor, int fontType, int backgroundColor){
        return String.format("\033[%d;%d;%dm%s\033[0m", fontColor, fontType, backgroundColor, content);
    }
    /**
     * 通过\033特殊转义字符实现输出格式控制,获得带颜色的字体输出     * @param content, 待格式化的内容
     * @param fontColor, 字体颜色:30黑 31红 32绿 33黄 34蓝 35紫 36深绿 37白
     * */    
    public static String getColoredOutputString(String content, int fontColor){
        return String.format("\033[%dm%s\033[0m", fontColor, content);
    }
    /**
     * 通过\033特殊转义字符实现输出格式控制,获得带背景颜色的字体输出     * @param content, 待格式化的内容
     * @param backgroundColor, 字背景颜色:40黑 41红 42绿 43黄 44蓝 45紫 46深绿 47白
     * */    
    public static String getBackgroundColoredOutputString(String content, int backgroundColor){
        return String.format("\033[%dm%s\033[0m", backgroundColor, content);
    }

    /**
     * 能接受一个顺序标识,按顺序产生带颜色的输出字符串     * */   
    public static String orderedColorString(String content, int i){
        int tmpColor = 31 + (i % 7);
        return String.format("\033[%dm%s\033[0m", tmpColor, content);
    }

    public static void main(String []args){
        System.out.println(getFormatOutputString("字体颜色为红色,背景色为黄色,带下划线", 31, 4, 43));
        //按顺序输出各个颜色代码的字符串
        for(int i = 0; i < 7; i++){
            System.out.println(getColoredOutputString(String.format("color code: %d", 31 + i), 31 + i));
        }
        //按顺序输出各个背景颜色代码的字符串
        for(int i = 0; i < 7; i++){
            System.out.println(getBackgroundColoredOutputString(String.format("background color code: %d", 41 + i), 41 + i));
        }
        //按顺序输出各个颜色代码的字符串
        for(int i = 0; i < 7; i++){
            System.out.println(orderedColorString(String.format("font color code: %d", 31 + i), i));
        }
    }
}

运行前面的程序,可以看到如下输出。

JAVA控制台输入(Scanner)及输出颜色「终于解决」_https://bianchenghao6.com/blog_Java_第3张

3、通过颜色区分不同编码格式输出

这里是一个例子,主要是展示java字符串不同编码格式的输出。


/**
 * Created by chengxia on 2022/8/19. */
public class MYJ2CTestOutputControl {
    /**
     * 通过\033特殊转义字符实现输出格式控制     * @param content, 待格式化的内容
     * @param fontColor, 字体颜色:30黑 31红 32绿 33黄 34蓝 35紫 36深绿 37白
     * @param fontType, 字体格式:0重置 1加粗 2减弱 3斜体 4下划线 5慢速闪烁 6快速闪烁
     * @param backgroundColor, 字背景颜色:40黑 41红 42绿 43黄 44蓝 45紫 46深绿 47白
     * */
    public static String getFormatOutputString(String content, int fontColor, int fontType, int backgroundColor){
        return String.format("\033[%d;%d;%dm%s\033[0m", fontColor, fontType, backgroundColor, content);
    }
    /**
     * 通过\033特殊转义字符实现输出格式控制,获得带颜色的字体输出     * @param content, 待格式化的内容
     * @param fontColor, 字体颜色:30黑 31红 32绿 33黄 34蓝 35紫 36深绿 37白
     * */
    public static String getColoredOutputString(String content, int fontColor){
        return String.format("\033[%dm%s\033[0m", fontColor, content);
    }
    /**
     * 通过\033特殊转义字符实现输出格式控制,获得带背景颜色的字体输出     * @param content, 待格式化的内容
     * @param backgroundColor, 字背景颜色:40黑 41红 42绿 43黄 44蓝 45紫 46深绿 47白
     * */
    public static String getBackgroundColoredOutputString(String content, int backgroundColor){
        return String.format("\033[%dm%s\033[0m", backgroundColor, content);
    }

    /**
     * 能接受一个顺序标识,按顺序产生带颜色的输出字符串     * */
    public static String orderedColorString(String content, int i){
        int tmpColor = 31 + (i % 7);
        return String.format("\033[%dm%s\033[0m", tmpColor, content);
    }

        /**
         * 将字符串str用字符c左补齐到长度len     * */
        private static String lpadString(String str, int len, char c){
            StringBuffer sb = new StringBuffer(str);
            for(int i = str.length(); i < len; i++){
                sb.insert(0, c);
            }
            return sb.toString();
        }
        /**
         * 将字符串转换为CodeUnit(各个CodeUnit之间带颜色区分)     * */
        public static String getColoredCodeUnitOfString(String str){
            StringBuffer sb = new StringBuffer();
            for(int i = 0; i < str.length(); i++){
                int tmpCodeUnit = (int)str.charAt(i);
                sb.append(orderedColorString(lpadString(Integer.toHexString(tmpCodeUnit), 4, '0').toUpperCase(), i));
            }
            return sb.toString();
        }
        /**
         * 将字符串转换为CodePoint(各个CodePoint之间带颜色区分)     * */
        public static String getColoredCodePointOfString(String str){
            StringBuffer sb = new StringBuffer();
            for(int i = 0; i < str.length(); i++){
                int tmpCodePoint = (int)str.codePointAt(i);
                sb.append(orderedColorString(lpadString(Integer.toHexString(tmpCodePoint), 4, '0').toUpperCase(), i));
                //如果当前这个CodePoint是增补字符集的话,两个char表示一个CodePoint需要额外自增1处理
                if(Character.isSupplementaryCodePoint(tmpCodePoint)){
                    i++;
                }
            }
            return sb.toString();
        }
        /**
         * 将字符串转换为不同编码格式表示(各个字符的编码之间带颜色区分)     * */
        public static String getColoredHexEncodeOfString(String str, String encoding){
            StringBuffer sb = new StringBuffer();
            for(int i = 0; i < str.length(); i++){
                int tmpCodePoint = (int)str.codePointAt(i);
                String tmpSubStr = str.substring(i, i + 1);
                //如果当前这个CodePoint是增补字符集的话,两个char表示一个CodePoint
                if(Character.isSupplementaryCodePoint(tmpCodePoint)){
                    tmpSubStr = tmpSubStr + str.substring(i + 1, i + 2);
                    i++;
                }
                try{
                    StringBuffer tmpSb = new StringBuffer();
                    byte[] tmpBytes = tmpSubStr.getBytes(encoding);
                    for(int iTmp = 0; iTmp < tmpBytes.length; iTmp++){
                        tmpSb.append(String.format("%02X", tmpBytes[iTmp]));
                    }
                    sb.append(orderedColorString(tmpSb.toString(), i));
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            return sb.toString();
        }

        public static void main(String []args){
            String strDiffEncoding = "MYJ2C是一款Java混淆工具";
            //将字符串用各种编码格式输出
            System.out.println("?" + " encode in GB2312 output:    " + getColoredHexEncodeOfString("?", "GB2312"));
            System.out.println("?" + " encode in GBK output:    " + getColoredHexEncodeOfString("?", "GBK"));
            System.out.println("?" + " encode in GB18030 output:    " + getColoredHexEncodeOfString("?", "GB18030"));
            System.out.println(strDiffEncoding + " code unit output:           " + getColoredCodeUnitOfString(strDiffEncoding));
            System.out.println(strDiffEncoding + " code point output:          " + getColoredCodePointOfString(strDiffEncoding));
            System.out.println(strDiffEncoding + " encode in GB2312 output:    " + getColoredHexEncodeOfString(strDiffEncoding, "GB2312"));
            System.out.println(strDiffEncoding + " encode in BIG5 output:      " + getColoredHexEncodeOfString(strDiffEncoding, "BIG5"));
            System.out.println(strDiffEncoding + " encode in GBK output:       " + getColoredHexEncodeOfString(strDiffEncoding, "GBK"));
            System.out.println(strDiffEncoding + " encode in GB18030 output:   " + getColoredHexEncodeOfString(strDiffEncoding, "GB18030"));
            System.out.println(strDiffEncoding + " encode in UTF-8 output:     " + getColoredHexEncodeOfString(strDiffEncoding, "UTF-8"));
            System.out.println(strDiffEncoding + " encode in UTF-16 output:    " + getColoredHexEncodeOfString(strDiffEncoding, "UTF-16"));
            System.out.println(strDiffEncoding + " encode in UTF-16BE output:  " + getColoredHexEncodeOfString(strDiffEncoding, "UTF-16BE"));
            System.out.println(strDiffEncoding + " encode in UTF-16LE output:  " + getColoredHexEncodeOfString(strDiffEncoding, "UTF-16LE"));
        }
    }

输出如下:

JAVA控制台输入(Scanner)及输出颜色「终于解决」_https://bianchenghao6.com/blog_Java_第4张

从这个结果可以看出,当一个字符在编码中不存在,找不到映射时,这个字符就会被映射为问号。

发表回复