ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 System.out.println 在控制台中打印颜色?

如何在控制台中打印颜色?我想在处理器发送数据时以颜色显示数据,在接收数据时以不同颜色显示数据。

如果控制台支持(例如 Eclipse Java 控制台)自定义标准输出/标准错误的颜色,那么您可以将 System.out.println 用于一种颜色,将 System.err.println 用于另一种颜色。

S
SergeyB

如果您的终端支持,您可以使用 ANSI escape codes 在输出中使用颜色。它通常适用于 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);

@WhiteFang34 至少在我的控制台中,如果颜色为黑色,您能否解释一下 RESET 的用途?是默认还是……?
@Boro:重置代码关闭了迄今为止设置的所有ANSI属性,这应该将控制台恢复为默认值。如果您不知道默认颜色或还使用其他一些属性(如背景颜色、字体样式等),这将很有用。
简思真的很棒!对于那些在 Eclipse 中开发的人,我可以推荐这个插件:mihai-nita.net/2013/06/03/eclipse-plugin-ansi-in-console 和一段不错的代码来启用颜色,如果代码没有在控制台中执行:if (System.console() == null) System.setProperty("jansi.passthrough", "true");
@PankajNimgade,再次阅读答案,您可能会注意到:however it doesn't work for Windows command prompt
@DannyLo 非常感谢您提供指向 Eclipse 插件的链接!
s
shakram02

以下是具有 public static 字段的 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
}

在 IntelliJ 控制台中运行良好,谢谢!
d
dialex

我创建了一个名为 JColor 的库,可在 Linux、macOS 和 Windows 10 上运行。

它使用 WhiteFang 提到的 ANSI 代码,但使用单词而不是更直观的代码来抽象它们。最近我添加了对 8 位和 24 位颜色的支持🌈

选择您的格式,colorize 并打印它:

System.out.println(colorize("Green text on blue", GREEN_TEXT(), BLUE_BACK()));

您还可以定义一次格式,然后多次重复使用它:

AnsiFormat fWarning = new AnsiFormat(RED_TEXT(), YELLOW_BACK(), BOLD());
System.out.println(colorize("Something bad happened!", fWarning));

前往 JColor github repository 查看一些示例。


好的。按预期工作。
如此精彩!我爱它!谢谢! :)
N
Nicolás Alarcón Rapela

尝试以下枚举:

enum Color {
    //Color end string, color reset
    RESET("\033[0m"),

    // Regular Colors. Normal color, no bold, background color etc.
    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;
    }
}

现在我们将做一个小例子:

class RunApp {
    public static void main(String[] args) {

        System.out.print(Color.BLACK_BOLD);
        System.out.println("Black_Bold");
        System.out.print(Color.RESET);

        System.out.print(Color.YELLOW);
        System.out.print(Color.BLUE_BACKGROUND);
        System.out.println("YELLOW & BLUE");
        System.out.print(Color.RESET);

        System.out.print(Color.YELLOW);
        System.out.println("YELLOW");
        System.out.print(Color.RESET);
    }
}

这是答案 stackoverflow.com/a/45444716/675577 的副本
j
jcomeau_ictx

一种相当便携的方法是使用原始转义序列。请参阅http://en.wikipedia.org/wiki/ANSI_escape_code

[于 2017-02-20 为 user9999999 编辑]

Java 不会“处理代码”,这是真的,但 Java 会输出您告诉它输出的内容。 Windows 控制台将 ESC (chr(27)) 视为另一个字形 (←) 并不是 Java 的错。

https://i.stack.imgur.com/cQwkY.png


这不起作用,因为 Java IO 层不会将它们转换为颜色。 System.out.println((char)27 + "[31;1mERROR" + (char)27 + "[0m" 从 windows cmd.com 作为可执行 .jar 运行时仅产生 "[31;1mERROR[0m"
该问题未标记为 windows。我记得 Windows 控制台从不符合 ANSI 标准。
但问题是 java 不处理代码,不管 cmd.com 的支持如何
请参阅编辑后的答案。 Java 完全按照它的说法行事。问题是不符合 ANSI 的控制台。
我有同样的问题
N
Nathan F.

您可以使用 ANSI 转义序列来执行此操作。实际上,我已经为任何想要一个简单解决方法的人用 Java 编写了这个类。它允许的不仅仅是颜色代码。

https://gist.github.com/nathan-fiscaletti/9dc252d30b51df7d710a

特征

完整的源文档

位颜色支持(16 色)

8 位颜色支持(255 种颜色)

24 位颜色支持(1670 万色) 支持十六进制和 8 位 RGB 值

支持十六进制和 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())

);

M
Mojtaba Hosseini

表情符号

您可以像其他人在他们的答案中提到的那样为文本使用颜色。

但是您可以改用表情符号!例如,您可以使用 ⚠️ 用于警告消息和 🛑 用于错误消息。

或者干脆将这些笔记本用作颜色:

📕: error message
📙: warning message
📗: ok status message
📘: action message
📓: canceled status message
📔: Or anything you like and want to recognize immediately by color

🎁 奖励:

此方法还可以帮助您直接在源代码中快速扫描和查找日志。

但是 Linux 和 Windows CMD 默认的表情符号字体在默认情况下不是彩色的,您可能希望首先让它们变得彩色。

如何打开表情符号面板?

mac os: 控制 + 命令 + 空格

windows: win + .

linux: control + .control + ;


这可能需要 UTF 或类似的支持。您只提供最终结果,而不是编码人员需要为此做的事情。答案可能会打破问题的范围。
由于亚历山大提到的原因,被否决了
添加了有关如何在不同操作系统中使用表情符号的说明。 @dialex
@AlexanderStohr 我添加了更多说明。如果您发现任何问题或比这更好的方法,请告诉我,如果您找到解决方案来完成社区的答案🙏
A
Ajmal Salim

如果有人正在寻找快速解决方案,请随时使用以下帮助类:)

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 代码。


N
NayoR

为控制台文本着色的最佳方法是使用 ANSI escape codes。除了文本颜色之外,ANSI 转义码还允许使用背景颜色、装饰等。

Unix

如果你使用 springboot,文本着色有一个特定的枚举:org.springframework.boot.ansi.AnsiColor

Jansi 库更高级一些(可以使用所有 ANSI 转义码函数),提供 API 并有一个使用 JNA 的 support for Windows

否则,您可以手动定义自己的颜色,如图所示是其他响应。

视窗 10

Windows 10(自 build 10.0.10586 - 2015 年 11 月以来)支持 ANSI 转义码 (MSDN documentation)默认情况下未启用。要启用它:

使用 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 颜色。但是可以使用控制台。


在 Windows 上,Cygwin 控制台完成了这项工作。此外,当使用带有例如“tee”的管道时,ANSI 颜色代码也会看到解释和效果。 Byond 颜色代码,ANSI 转义也可以做例如光标控制。
不,变量必须直接在键 HKEY_CURRENT_USER\Console 中 - 不要在那里创建另一个键 VirtualTerminalLevel
S
Shadi Abu Hilal

使用颜色函数打印带有颜色的文本

代码:

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')
}

S
Satish M

三振:

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";

L
Louis CAD

如果您使用 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 ""
}

然后使用是这样的:(下面的代码展示了所有颜色的不同样式)

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 检查通过将代码替换为空字符串来避免问题。


I
Islam Khaled

这个 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")

J
Jorge Berjano

您可以使用 JAnsi 依赖项在 Linux 和 Windows 中更改颜色。它以正确的方式打印 UTF-8 字符。 https://github.com/fusesource/jansi


D
David

在 Java 中以红色打印任何文本的最佳解决方案是:

System.err.print("Hello World");

“downvote”不是我的 - 但是,还有其他答案可以提供 OP 的问题,它们是前一段时间发布的。发布答案 see: How do I write a good answer? 时,请确保添加新的解决方案或更好的解释,尤其是在回答较旧的问题时。
@iSahil 这可能被否决了,因为简单地写入标准错误并没有明确地为任何东西着色。许多 IDE 和控制台会解释错误消息并以红色或类似的形式打印它们,但这不是您可以依赖的。
虽然这不是上述问题的直接答案,但这是我在搜索“红色控制台中的 java 打印”时正在寻找的答案。因此,我确实觉得它在此页面上占有一席之地。
仅仅为了颜色打印到不同的输出流会给你带来很多问题