How to print color in console using System.out.println?
如何在控制台中打印颜色? 我想在处理器发送数据时以彩色显示数据,而在接收数据时以不同的颜色显示数据。
如果您的终端支持,则可以使用ANSI转义码在输出中使用颜色。它通常适用于Unix Shell提示符;但是,它不适用于Windows命令提示符(尽管它适用于Cygwin)。例如,您可以为颜色定义如下常量:
1 2 3 4 5 6 7 8 9 | public static final String ANSI_RESET ="\u001B[0m"; public static final String ANSI_BLACK ="\u001B[30m"; public static final String ANSI_RED ="\u001B[31m"; public static final String ANSI_GREEN ="\u001B[32m"; public static final String ANSI_YELLOW ="\u001B[33m"; public static final String ANSI_BLUE ="\u001B[34m"; public static final String ANSI_PURPLE ="\u001B[35m"; public static final String ANSI_CYAN ="\u001B[36m"; public static final String ANSI_WHITE ="\u001B[37m"; |
然后,您可以根据需要引用它们。
例如,使用上述常量,可以在支持的终端上输出以下红色文本:
1 |
更新:您可能想签出Jansi库。它提供了一个API,并支持使用JNI的Windows。我还没试过但是,它看起来很有希望。
更新2:此外,如果您希望将文本的背景色更改为其他颜色,也可以尝试以下操作:
1 2 3 4 5 6 7 8 | public static final String ANSI_BLACK_BACKGROUND ="\u001B[40m"; public static final String ANSI_RED_BACKGROUND ="\u001B[41m"; public static final String ANSI_GREEN_BACKGROUND ="\u001B[42m"; public static final String ANSI_YELLOW_BACKGROUND ="\u001B[43m"; public static final String ANSI_BLUE_BACKGROUND ="\u001B[44m"; public static final String ANSI_PURPLE_BACKGROUND ="\u001B[45m"; public static final String ANSI_CYAN_BACKGROUND ="\u001B[46m"; public static final String ANSI_WHITE_BACKGROUND ="\u001B[47m"; |
例如:
1 2 3 | System.out.println(ANSI_GREEN_BACKGROUND +"This text has a green background but default text!" + ANSI_RESET); System.out.println(ANSI_RED +"This text has red text but a default background!" + ANSI_RESET); System.out.println(ANSI_GREEN_BACKGROUND + ANSI_RED +"This text has a green background and red text!" + ANSI_RESET); |
这是带有
用法
1 2 |
注意
不要忘记在打印后使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | public class ConsoleColors { // Reset public static final String RESET ="\033[0m"; // Text Reset // Regular Colors public static final String BLACK ="\033[0;30m"; // BLACK public static final String RED ="\033[0;31m"; // RED public static final String GREEN ="\033[0;32m"; // GREEN public static final String YELLOW ="\033[0;33m"; // YELLOW public static final String BLUE ="\033[0;34m"; // BLUE public static final String PURPLE ="\033[0;35m"; // PURPLE public static final String CYAN ="\033[0;36m"; // CYAN public static final String WHITE ="\033[0;37m"; // WHITE // Bold public static final String BLACK_BOLD ="\033[1;30m"; // BLACK public static final String RED_BOLD ="\033[1;31m"; // RED public static final String GREEN_BOLD ="\033[1;32m"; // GREEN public static final String YELLOW_BOLD ="\033[1;33m"; // YELLOW public static final String BLUE_BOLD ="\033[1;34m"; // BLUE public static final String PURPLE_BOLD ="\033[1;35m"; // PURPLE public static final String CYAN_BOLD ="\033[1;36m"; // CYAN public static final String WHITE_BOLD ="\033[1;37m"; // WHITE // Underline public static final String BLACK_UNDERLINED ="\033[4;30m"; // BLACK public static final String RED_UNDERLINED ="\033[4;31m"; // RED public static final String GREEN_UNDERLINED ="\033[4;32m"; // GREEN public static final String YELLOW_UNDERLINED ="\033[4;33m"; // YELLOW public static final String BLUE_UNDERLINED ="\033[4;34m"; // BLUE public static final String PURPLE_UNDERLINED ="\033[4;35m"; // PURPLE public static final String CYAN_UNDERLINED ="\033[4;36m"; // CYAN public static final String WHITE_UNDERLINED ="\033[4;37m"; // WHITE // Background public static final String BLACK_BACKGROUND ="\033[40m"; // BLACK public static final String RED_BACKGROUND ="\033[41m"; // RED public static final String GREEN_BACKGROUND ="\033[42m"; // GREEN public static final String YELLOW_BACKGROUND ="\033[43m"; // YELLOW public static final String BLUE_BACKGROUND ="\033[44m"; // BLUE public static final String PURPLE_BACKGROUND ="\033[45m"; // PURPLE public static final String CYAN_BACKGROUND ="\033[46m"; // CYAN public static final String WHITE_BACKGROUND ="\033[47m"; // WHITE // High Intensity public static final String BLACK_BRIGHT ="\033[0;90m"; // BLACK public static final String RED_BRIGHT ="\033[0;91m"; // RED public static final String GREEN_BRIGHT ="\033[0;92m"; // GREEN public static final String YELLOW_BRIGHT ="\033[0;93m"; // YELLOW public static final String BLUE_BRIGHT ="\033[0;94m"; // BLUE public static final String PURPLE_BRIGHT ="\033[0;95m"; // PURPLE public static final String CYAN_BRIGHT ="\033[0;96m"; // CYAN public static final String WHITE_BRIGHT ="\033[0;97m"; // WHITE // Bold High Intensity public static final String BLACK_BOLD_BRIGHT ="\033[1;90m"; // BLACK public static final String RED_BOLD_BRIGHT ="\033[1;91m"; // RED public static final String GREEN_BOLD_BRIGHT ="\033[1;92m"; // GREEN public static final String YELLOW_BOLD_BRIGHT ="\033[1;93m";// YELLOW public static final String BLUE_BOLD_BRIGHT ="\033[1;94m"; // BLUE public static final String PURPLE_BOLD_BRIGHT ="\033[1;95m";// PURPLE public static final String CYAN_BOLD_BRIGHT ="\033[1;96m"; // CYAN public static final String WHITE_BOLD_BRIGHT ="\033[1;97m"; // WHITE // High Intensity backgrounds public static final String BLACK_BACKGROUND_BRIGHT ="\033[0;100m";// BLACK public static final String RED_BACKGROUND_BRIGHT ="\033[0;101m";// RED public static final String GREEN_BACKGROUND_BRIGHT ="\033[0;102m";// GREEN public static final String YELLOW_BACKGROUND_BRIGHT ="\033[0;103m";// YELLOW public static final String BLUE_BACKGROUND_BRIGHT ="\033[0;104m";// BLUE public static final String PURPLE_BACKGROUND_BRIGHT ="\033[0;105m"; // PURPLE public static final String CYAN_BACKGROUND_BRIGHT ="\033[0;106m"; // CYAN public static final String WHITE_BACKGROUND_BRIGHT ="\033[0;107m"; // WHITE } |
我创建了一个名为JCDP(Java彩色调试打印机)的库。
对于Linux,它使用WhiteFang提到的ANSI转义代码,但是使用单词而不是代码来抽象它们,这更加直观。它变得像:
1 |
对于Windows,它依赖JAnsi,但在其上创建一个抽象层,并保持上面显示的直观和简单的API。
您在JCDP的github存储库中有一些示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | public enum Color { //颜色结尾字符串,重置颜色的 RESET("\033[0m"), // Regular Colors 普通颜色,不带加粗,背景色等 BLACK("\033[0;30m"), // BLACK RED("\033[0;31m"), // RED GREEN("\033[0;32m"), // GREEN YELLOW("\033[0;33m"), // YELLOW BLUE("\033[0;34m"), // BLUE MAGENTA("\033[0;35m"), // MAGENTA CYAN("\033[0;36m"), // CYAN WHITE("\033[0;37m"), // WHITE // Bold BLACK_BOLD("\033[1;30m"), // BLACK RED_BOLD("\033[1;31m"), // RED GREEN_BOLD("\033[1;32m"), // GREEN YELLOW_BOLD("\033[1;33m"), // YELLOW BLUE_BOLD("\033[1;34m"), // BLUE MAGENTA_BOLD("\033[1;35m"), // MAGENTA CYAN_BOLD("\033[1;36m"), // CYAN WHITE_BOLD("\033[1;37m"), // WHITE // Underline BLACK_UNDERLINED("\033[4;30m"), // BLACK RED_UNDERLINED("\033[4;31m"), // RED GREEN_UNDERLINED("\033[4;32m"), // GREEN YELLOW_UNDERLINED("\033[4;33m"), // YELLOW BLUE_UNDERLINED("\033[4;34m"), // BLUE MAGENTA_UNDERLINED("\033[4;35m"), // MAGENTA CYAN_UNDERLINED("\033[4;36m"), // CYAN WHITE_UNDERLINED("\033[4;37m"), // WHITE // Background BLACK_BACKGROUND("\033[40m"), // BLACK RED_BACKGROUND("\033[41m"), // RED GREEN_BACKGROUND("\033[42m"), // GREEN YELLOW_BACKGROUND("\033[43m"), // YELLOW BLUE_BACKGROUND("\033[44m"), // BLUE MAGENTA_BACKGROUND("\033[45m"), // MAGENTA CYAN_BACKGROUND("\033[46m"), // CYAN WHITE_BACKGROUND("\033[47m"), // WHITE // High Intensity BLACK_BRIGHT("\033[0;90m"), // BLACK RED_BRIGHT("\033[0;91m"), // RED GREEN_BRIGHT("\033[0;92m"), // GREEN YELLOW_BRIGHT("\033[0;93m"), // YELLOW BLUE_BRIGHT("\033[0;94m"), // BLUE MAGENTA_BRIGHT("\033[0;95m"), // MAGENTA CYAN_BRIGHT("\033[0;96m"), // CYAN WHITE_BRIGHT("\033[0;97m"), // WHITE // Bold High Intensity BLACK_BOLD_BRIGHT("\033[1;90m"), // BLACK RED_BOLD_BRIGHT("\033[1;91m"), // RED GREEN_BOLD_BRIGHT("\033[1;92m"), // GREEN YELLOW_BOLD_BRIGHT("\033[1;93m"), // YELLOW BLUE_BOLD_BRIGHT("\033[1;94m"), // BLUE MAGENTA_BOLD_BRIGHT("\033[1;95m"), // MAGENTA CYAN_BOLD_BRIGHT("\033[1;96m"), // CYAN WHITE_BOLD_BRIGHT("\033[1;97m"), // WHITE // High Intensity backgrounds BLACK_BACKGROUND_BRIGHT("\033[0;100m"), // BLACK RED_BACKGROUND_BRIGHT("\033[0;101m"), // RED GREEN_BACKGROUND_BRIGHT("\033[0;102m"), // GREEN YELLOW_BACKGROUND_BRIGHT("\033[0;103m"), // YELLOW BLUE_BACKGROUND_BRIGHT("\033[0;104m"), // BLUE MAGENTA_BACKGROUND_BRIGHT("\033[0;105m"), // MAGENTA CYAN_BACKGROUND_BRIGHT("\033[0;106m"), // CYAN WHITE_BACKGROUND_BRIGHT("\033[0;107m"); // WHITE private final String code; Color(String code) { this.code = code; } @Override public String toString() { return code; } } System.out.print(Color.BLACK_BOLD); System.out.println("111111111aaaaaaaaaaaaaaaa=============="); System.out.print(Color.RESET); System.out.print(Color.BLUE_BACKGROUND); System.out.print(Color.YELLOW); //设置前景色 为YELLOW System.out.println("111111111aaaaaaaaaaaaaaaa==============马哥私房菜"); System.out.println("111111111aaaaaaaaaaaaaaaa==============马哥私房菜"); System.out.println("111111111aaaaaaaaaaaaaaaa==============马哥私房菜"); System.out.println("111111111aaaaaaaaaaaaaaaa==============马哥私房菜"); System.out.print(Color.RESET); |
原始转义序列是一种相当可移植的方法。参见http://en.wikipedia.org/wiki/ANSI_escape_code
[于2017-02-20为user9999999编辑]
Java不会"处理代码",这是正确的,但是Java输出了您告诉它的输出。 Windows控制台将ESC(chr(27))当作另一个字形(←)并不是Java的错。
您可以使用ANSI转义序列来执行此操作。实际上,我已经将Java中的此类放在一起,以供任何想要简单解决方法的人使用。它不仅允许使用颜色代码。
https://gist.github.com/nathan-fiscaletti/9dc252d30b51df7d710a
(移植自:https://github.com/nathan-fiscaletti/ansi-util)
使用示例:
1 2 3 4 5 6 7 8 9 10 11 | StringBuilder sb = new StringBuilder(); System.out.println( sb.raw("Hello,") .underline("John Doe") .resetUnderline() .raw(".") .raw("This is") .color16(StringBuilder.Color16.FG_RED,"red") .raw(".") ); |
如果有人在寻找快速解决方案,请随时使用以下帮助程序类:)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public class Log { public static final String ANSI_RESET ="\u001B[0m"; public static final String ANSI_BLACK ="\u001B[30m"; public static final String ANSI_RED ="\u001B[31m"; public static final String ANSI_GREEN ="\u001B[32m"; public static final String ANSI_YELLOW ="\u001B[33m"; public static final String ANSI_BLUE ="\u001B[34m"; public static final String ANSI_PURPLE ="\u001B[35m"; public static final String ANSI_CYAN ="\u001B[36m"; public static final String ANSI_WHITE ="\u001B[37m"; //info public static void i(String className, String message) { System.out.println(ANSI_GREEN + className +" :" + message + ANSI_RESET); } //error public static void e(String className, String message) { System.out.println(ANSI_RED + className +" :" + message + ANSI_RESET); } //debug public static void d(String className, String message) { System.out.println(ANSI_BLUE + className +" :" + message + ANSI_RESET); } //warning public static void w(String className, String message) { System.out.println(ANSI_YELLOW + className +" :" + message + ANSI_RESET); } } |
用法:
1 2 3 4 5 6 7 | Log.i(TAG,"This is an info message"); Log.e(TAG,"This is an error message"); Log.w(TAG,"This is a warning message"); Log.d(TAG,"This is a debug message"); |
感谢@ whiteFang34提供ANSI代码。
为控制台文本着色的最佳方法是使用ANSI转义码。除文本颜色外,ANSI转义码还允许使用背景颜色,装饰等。
Unix的
如果您使用springboot,则有一个特定的枚举用于文本着色:org.springframework.boot.ansi.AnsiColor
Jansi库有点高级(可以使用所有ANSI转义码功能),提供了API,并支持使用JNA的Windows。
否则,您可以手动定义自己的颜色,如其他响应所示。
Windows 10
Windows 10(自内部版本10.0.10586-2015年11月以来)支持ANSI转义码(MSDN文档),但默认情况下未启用。要启用它:
-
通过SetConsoleMode API,使用
ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400) 标志。 Jansi使用此选项。 -
如果未使用SetConsoleMode API,则可以通过创建dword并将其设置为0或1进行ANSI处理来更改全局注册表项
HKEY_CURRENT_USER\Console\VirtualTerminalLevel :
"VirtualTerminalLevel"=dword:00000001
Windows 10之前
Windows控制台不支持ANSI颜色。但是可以使用控制台。
如果您使用Kotlin(可与Java无缝集成),则可以进行这样的枚举:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | enum class AnsiColor(private val colorNumber: Byte) { BLACK(0), RED(1), GREEN(2), YELLOW(3), BLUE(4), MAGENTA(5), CYAN(6), WHITE(7); companion object { private const val prefix ="\u001B" const val RESET ="$prefix[0m" private val isCompatible ="win" !in System.getProperty("os.name").toLowerCase() } val regular get() = if (isCompatible)"$prefix[0;3${colorNumber}m" else"" val bold get() = if (isCompatible)"$prefix[1;3${colorNumber}m" else"" val underline get() = if (isCompatible)"$prefix[4;3${colorNumber}m" else"" val background get() = if (isCompatible)"$prefix[4${colorNumber}m" else"" val highIntensity get() = if (isCompatible)"$prefix[0;9${colorNumber}m" else"" val boldHighIntensity get() = if (isCompatible)"$prefix[1;9${colorNumber}m" else"" val backgroundHighIntensity get() = if (isCompatible)"$prefix[0;10${colorNumber}m" else"" } |
然后这样使用:(下面的代码展示了所有颜色的不同样式)
1 2 3 4 5 6 7 8 9 10 | val sampleText ="This is a sample text" enumValues<AnsiColor>().forEach { ansiColor -> println("${ansiColor.regular}$sampleText${AnsiColor.RESET}") println("${ansiColor.bold}$sampleText${AnsiColor.RESET}") println("${ansiColor.underline}$sampleText${AnsiColor.RESET}") println("${ansiColor.background}$sampleText${AnsiColor.RESET}") println("${ansiColor.highIntensity}$sampleText${AnsiColor.RESET}") println("${ansiColor.boldHighIntensity}$sampleText${AnsiColor.RESET}") println("${ansiColor.backgroundHighIntensity}$sampleText${AnsiColor.RESET}") } |
如果在不支持这些ANSI代码的Windows上运行,则