我如何在控制台打印颜色?当处理器发送数据时,我想用不同的颜色显示数据,当处理器接收数据时,我想用不同的颜色显示数据。
当前回答
在Java中用红色打印任何文本的最佳解决方案是:
System.err.print("Hello World");
其他回答
为控制台文本上色的最好方法是使用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颜色。但也可以使用控制台。
如果你使用Kotlin(它与Java无缝工作),你可以创建这样一个枚举:
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 ""
}
然后像这样使用is:(下面的代码展示了所有颜色的不同样式)
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上,isCompatible检查通过将代码替换为空字符串来避免问题。
您可以使用ANSI转义序列来实现这一点。实际上,我已经在Java中为任何想要简单解决这个问题的人组合了这个类。它允许的不仅仅是颜色代码。
https://gist.github.com/nathan-fiscaletti/9dc252d30b51df7d710a
特性
完整的源代码文档 4位颜色支持(16种颜色) 8位颜色支持(255种颜色) 24位颜色支持(1670万种颜色) 支持十六进制和8位RGB值 支持通用格式 隐藏文本,反转颜色,闪烁,下划线,删除,暗淡,粗体,斜体 能够从包含ANSI转义序列的字符串中剥离ANSI。
示例使用
System.out.println(
new AnsiStringBuilder()
// All formatting functions support at least three different
// overloads, each intended for a different use case.
// Use case 1: Manual Reset
.italic()
.append("This is italicized and reset manually.")
// You can optionaly supply an additional append string
// to any of the reset functions that will be appended
// after the formating reset has been applied.
.resetItalic(System.lineSeparator())
// Use case 2: Automatic Reset
.dim("This is dimmed and reset automatically.")
.append(System.lineSeparator())
// Use case 3: Function Consumer
.underline(
sb -> {
// The string builder passed to this function consumer
// will automatically wrap all content appended to it
// with the underline formatting.
sb.color24(
"#00ff00",
"This is both underlined and green"
);
}
)
.append(System.lineSeparator())
);
下面是带有公共静态字段的Java类中的颜色列表
使用
System.out.println(ConsoleColors.RED + "RED COLORED" +
ConsoleColors.RESET + " NORMAL");
请注意 不要忘记在打印后使用RESET,因为如果它没有被清除,效果将仍然存在
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
}
这个kotlin代码对我有用
import java.io.PrintStream
sealed class BackgroundColor(val value: Int) {
object Default : BackgroundColor(0)
// normal colors
object Black : BackgroundColor(40)
object Red : BackgroundColor(41)
object Green : BackgroundColor(42)
object Yellow : BackgroundColor(43)
object Blue : BackgroundColor(44)
object Magenta : BackgroundColor(45)
object Cyan : BackgroundColor(46)
object White : BackgroundColor(47)
// colors with high contrast
object BlackBright : BackgroundColor(100)
object RedBright : BackgroundColor(101)
object GreenBright : BackgroundColor(102)
object YellowBright : BackgroundColor(103)
object BlueBright : BackgroundColor(104)
object MagentaBright : BackgroundColor(105)
object CyanBright : BackgroundColor(106)
object WhiteBright : BackgroundColor(107)
}
sealed class TextColor(val value: Int) {
object Default : TextColor(0)
// normal colors
object Black : TextColor(30)
object Red : TextColor(31)
object Green : TextColor(32)
object Yellow : TextColor(33)
object Blue : TextColor(34)
object Magenta : TextColor(35)
object Cyan : TextColor(36)
object White : TextColor(37)
// colors with high contrast
object BlackBright : TextColor(90)
object RedBright : TextColor(91)
object GreenBright : TextColor(92)
object YellowBright : TextColor(93)
object BlueBright : TextColor(94)
object MagentaBright : TextColor(95)
object CyanBright : TextColor(96)
object WhiteBright : TextColor(97)
}
fun styleOutput(
backgroundColor: BackgroundColor = BackgroundColor.Default,
textColor: TextColor = TextColor.Default,
boldText : Boolean = false,
italicText : Boolean = false,
underLineText : Boolean = false,
action : PrintStream.() -> Unit
) {
val styleFormat = StringBuilder("${27.toChar()}[${backgroundColor.value};${textColor.value}")
if (boldText)
styleFormat.append(";1")
if (italicText)
styleFormat.append(";3")
if (underLineText)
styleFormat.append(";4")
styleFormat.append("m")
print(styleFormat)
System.out.action()
print("${27.toChar()}[0m")
}
然后使用它
print("text without styling")
styleOutput(backgroundColor = BackgroundColor.Blue, textColor = TextColor.GreenBright, boldText = true) {
print("text with styling")
}
print("text without styling")
推荐文章
- 指定的子节点已经有一个父节点。你必须先在子对象的父对象上调用removeView() (Android)
- 我如何获得iOS 7默认的蓝色编程?
- 对于一个布尔字段,它的getter/setter的命名约定是什么?
- 如何获得当前屏幕方向?
- 如何在Android中渲染PDF文件
- 如何计算一个元素在列表中出现的次数
- c++中类似于java的instanceof
- 我如何解决错误“minCompileSdk(31)指定在一个依赖的AAR元数据”在本机Java或Kotlin?
- 如何在扑动中垂直和水平居中文本?
- 如何POST表单数据与Spring RestTemplate?
- Mockito中检测到未完成的存根
- 我应该如何复制字符串在Java?
- “while(true)”循环有那么糟糕吗?
- 矩形内的文本
- 如何在一张图中为不同的地块得到不同颜色的线条