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

477

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


2
如果控制台支持(例如Eclipse Java控制台)自定义标准输出/错误输出的颜色,则可以使用System.out.println来设置一种颜色,使用System.err.println来设置另一种颜色。 - jw_
16个回答

796
如果您的终端支持,您可以使用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);

1
@WhiteFang34,你能解释一下RESET的作用吗?在我的控制台中它的颜色是黑色,这是默认值还是其他什么东西? - Boro
9
重置代码会关闭到目前为止设置的所有 ANSI 属性,这应该会将控制台恢复到其默认状态。如果您不知道默认颜色或者也在使用其他属性如背景颜色、字体样式等,这将非常有用。 - WhiteFang34
2
jansi真的很棒!对于那些在eclipse中开发的人,我可以推荐这个插件:http://mihai-nita.net/2013/06/03/eclipse-plugin-ansi-in-console/。如果代码没有在控制台中执行,可以使用以下代码启用颜色:`if (System.console() == null) System.setProperty("jansi.passthrough", "true");` - Danny Lo
2
@PankajNimgade,请再次阅读答案,您可能会注意到这一点:“但是它不适用于Windows命令提示符”。 - Felix Edelmann
1
据我所知,它应该在较新版本的Windows 10中与conhost一起工作,因为它支持ansi代码。 - dan1st
显示剩余9条评论

183

这是一个Java类中的颜色列表,其中包含具有public static字段。

用法

System.out.println(ConsoleColors.RED + "RED COLORED" +
ConsoleColors.RESET + " NORMAL");


注意 在打印后不要忘记使用RESET,否则效果将保留。


注意 在打印后不要忘记使用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
}

8
在IntelliJ控制台中非常好用,谢谢! - CharlesC
这是一个很棒的答案。如果有人能为了完整性而编辑它,加上斜体,那就太好了。谢谢! - user0221441

92

我创建了一个名为JColor的库,它可以在Linux、macOS和Windows 10上使用。

它使用了WhiteFang提到的ANSI代码,但是用单词代替代码进行抽象,这更容易理解。最近我添加了对8位和24位颜色的支持。

选择您的格式,上色,并打印出来:

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存储库查看一些示例。


2
不错。按预期工作。 - Avec
2
太棒了!我喜欢它!谢谢! :) - aymens
找到了。implementation 'com.diogonunes:JColor:5.5.1' - Orubel
是的,所有版本都在这里 https://mvnrepository.com/artifact/com.diogonunes/JColor - dialex
可爱的图书馆,谢谢。 - undefined

75

尝试以下枚举:

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

9
这是答案 https://dev59.com/hW025IYBdhLWcg3w25uy#45444716 的副本。 - dialex
1
@dialex 那个答案似乎最初来自w3schools,而这个答案将常量作为枚举提供,我认为这是更干净、更现代化的代码和更好的保持这些常量的做法。 - Marvin
我同意你的看法。 - dialex

14

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

[编辑于2017年2月20日用户9999999]

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

你让我重启到Windows了,你欠我一个人情


这段代码无法正常工作,因为Java IO层不会将其转换为颜色。当在Windows cmd.com中作为可执行的.jar文件运行时,System.out.println((char)27 + "[31;1mERROR" + (char)27 + "[0m"只会产生"[31;1mERROR[0m"。 - simpleuser
这个问题没有被标记为“Windows”。我记得 Windows 控制台从来没有符合 ANSI 标准。 - jcomeau_ictx
3
Java正按照其指令执行。问题在于非ANSI兼容控制台。 - jcomeau_ictx
1
我有同样的问题。 - Stéphane GRILLON
查看 http://cmder.net/;这个控制台在Windows上工作良好,可以显示彩色文本。 - morbac
显示剩余2条评论

12

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

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


12

您可以使用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())

);

12

表情符号

如其他人在他们的答案中所述,您可以使用颜色来为文本着色。

但是您也可以使用表情符号!例如,您可以使用⚠️表示警告信息,表示错误消息。

或者简单地将这些笔记本用作颜色:

: 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: control + command + space

Windows: win + .

Linux: control + .control + ;


2
你只提供最终结果,而不是程序员需要为此做的事情。 答案可能会超出问题所涵盖的范围。 - Alexander Stohr
因为亚历山大提到的原因,被踩了。 - dialex
添加了如何在不同操作系统中使用表情符号的说明。@dialex - Mojtaba Hosseini
@AlexanderStohr,我添加了一些更多的指示。如果您发现任何问题或者找到解决方案来完成社区的答案,请告诉我。 - Mojtaba Hosseini

7
最佳的控制台文本着色方法是使用ANSI转义码。除了文本颜色,ANSI转义码还允许背景颜色、装饰等。 Unix 如果您使用springboot,则有一个特定的枚举用于文本着色:org.springframework.boot.ansi.AnsiColor Jansi库更为先进(可以使用所有ANSI转义码函数),提供API并支持使用JNA的Windows系统
否则,您可以手动定义自己的颜色,如其他响应中所示。 Windows 10

自2015年11月的版本10.0.10586起,Windows 10支持ANSI转义码(MSDN文档),但默认情况下未启用。要启用它:

  • 使用SetConsoleMode API, 使用ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)标志。Jansi使用此选项。
  • 如果未使用SetConsoleMode API,则可以通过创建一个dword并将其设置为0或1来更改全局注册表键HKEY_CURRENT_USER\Console\VirtualTerminalLevel,以进行ANSI处理: "VirtualTerminalLevel"=dword:00000001

在Windows 10之前

Windows控制台不支持ANSI颜色。但是可以使用支持它的控制台。


在Windows上,Cygwin控制台可以胜任此工作。此外,当使用管道时,例如“tee”,则ANSI颜色代码会看到解释和可能的影响。除了颜色代码之外,ANSI转义还可以执行光标控制等操作。 - Alexander Stohr
不,变量必须直接在键“HKEY_CURRENT_USER\Console”中 - 不要在其中创建另一个键“VirtualTerminalLevel”。 - AmigoJack

2
使用颜色函数打印彩色文本 代码:
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')
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接