我如何在控制台打印颜色?当处理器发送数据时,我想用不同的颜色显示数据,当处理器接收数据时,我想用不同的颜色显示数据。
当前回答
失败:
public static final String ANSI_STRIKEOUT_BLACK = "\u001B[30;9m";
public static final String ANSI_STRIKEOUT_RED = "\u001B[31;9m";
public static final String ANSI_STRIKEOUT_GREEN = "\u001B[32;9m";
public static final String ANSI_STRIKEOUT_YELLOW = "\u001B[33;9m";
public static final String ANSI_STRIKEOUT_BLUE = "\u001B[34;9m";
public static final String ANSI_STRIKEOUT_PURPLE = "\u001B[35;9m";
public static final String ANSI_STRIKEOUT_CYAN = "\u001B[36;9m";
public static final String ANSI_STRIKEOUT_WHITE = "\u001B[37;9m";
其他回答
为控制台文本上色的最好方法是使用ANSI转义码。除了文本颜色,ANSI转义码还允许背景色、装饰色等。
Unix
如果你使用springboot,文本着色有一个特定的enum: org.springframework.boot.ansi.AnsiColor
Jansi库更高级一点(可以使用所有的ANSI转义代码函数),提供了一个API,并支持使用JNA的Windows。
否则,您可以手动定义自己的颜色,如其他响应所示。
Windows 10
Windows 10(自build 10.0.10586 - 2015年11月)支持ANSI转义码(MSDN文档),但默认情况下不启用。启用它:
对于SetConsoleMode API,使用ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)标志。Jansi使用这个选项。 如果没有使用SetConsoleMode API,可以通过创建一个dword来更改全局注册表键HKEY_CURRENT_USER\Console\VirtualTerminalLevel,并将其设置为0或1用于ANSI处理: “VirtualTerminalLevel”= dword: 00000001
Windows 10之前
Windows控制台不支持ANSI颜色。但也可以使用控制台。
在Java中用红色打印任何文本的最佳解决方案是:
System.err.print("Hello World");
使用颜色功能打印带有颜色的文本
代码:
enum Color {
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
private final String code
Color(String code) {
this.code = code;
}
@Override
String toString() {
return code
}
}
def color = { color, txt ->
def RESET_COLOR = "\033[0m"
return "${color}${txt}${RESET_COLOR}"
}
用法:
test {
println color(Color.CYAN, 'testing')
}
如果您的终端支持它,您可以使用ANSI转义码在输出中使用颜色。它通常适用于Unix shell提示符;然而,它并不适用于Windows命令提示符(尽管,它适用于Cygwin)。例如,你可以为颜色定义这样的常量:
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";
然后,您可以在必要时引用它们。
例如,使用上述常量,你可以在受支持的终端上输出如下红色文本:
System.out.println(ANSI_RED + "This text is red!" + ANSI_RESET);
更新:您可能想要查看Jansi库。它提供了一个API,并支持使用JNI的Windows。我还没试过;然而,它看起来很有希望。
更新2:同样,如果你想改变文本的背景颜色为不同的颜色,你也可以尝试以下方法:
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";
例如:
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);
如果有人正在寻找一个快速的解决方案,请随意使用以下helper类:)
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);
}
}
用法:
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代码。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap