Como imprimir em cores no console usando System.out.println?

326

Como posso imprimir em cores no console? Quero mostrar dados em cores quando o processador envia dados e em cores diferentes quando recebe dados.

Taranath Datta
fonte
2
Se o console suportar (por exemplo, console Java do Eclipse) personalizar cores de stdout / stderr, será possível usar System.out.println para uma cor e System.err.println para outra cor.
jw_

Respostas:

585

Se o seu terminal suportar, você pode usar códigos de escape ANSI para usar cores em sua saída. Geralmente funciona para prompts de shell do Unix; no entanto, ele não funciona no prompt de comando do Windows (apesar de funcionar no Cygwin). Por exemplo, você pode definir constantes como estas para as cores:

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

Em seguida, você pode fazer referência a eles conforme necessário.

Por exemplo, usando as constantes acima, você pode fazer a seguinte saída de texto em vermelho nos terminais suportados:

System.out.println(ANSI_RED + "This text is red!" + ANSI_RESET);

Atualização: você pode querer verificar a biblioteca Jansi . Ele fornece uma API e tem suporte para Windows usando JNI. Ainda não tentei; no entanto, parece promissor.

Atualização 2: Além disso, se você deseja alterar a cor do plano de fundo do texto para uma cor diferente, tente também o seguinte:

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

Por exemplo:

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
fonte
1
@ WhiteFang34 Você pode, por favor, explicar qual é a utilidade do RESET se sua cor é PRETA, pelo menos no meu console? É como um padrão ou sth.?
Boro
8
@Boro: o código de redefinição desativa todos os atributos ANSI definidos até o momento, o que deve retornar o console aos seus padrões. É útil se você não sabe a cor padrão ou também estão usando alguns dos outros atributos como cor de fundo, estilos de fonte, etc.
WhiteFang34
2
jansi é realmente ótimo! para quem desenvolve eclipse, recomendo este plugin: mihai-nita.net/2013/06/03/eclipse-plugin-ansi-in-console e um bom código para ativar a cor se o código não estiver sendo executado no console:if (System.console() == null) System.setProperty("jansi.passthrough", "true");
Danny Lo
1
@PankajNimgade, leia a resposta novamente e você talvez perceber isso:however it doesn't work for Windows command prompt
Felix Edelmann
1
@ DannyLo Muito obrigado pelo link para o plugin Eclipse!
Noah Broyles
72

Aqui está uma lista de cores em uma classe Java com public staticcampos

Uso

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


Nota Não se esqueça de usar a RESETpós-impressão, pois o efeito permanecerá se não for limpo.


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
}
shakram02
fonte
55

Criei uma biblioteca chamada JCDP ( Java Colored Debug Printer ).

Para Linux, macOS e Windows 10, ele usa os códigos de escape ANSI mencionados pelo WhiteFang, mas os abstrai usando palavras em vez de códigos, o que é muito mais intuitivo. Torna-se tão fácil quanto:

print("Hello World!", Attribute.BOLD, FColor.YELLOW, BColor.GREEN);

Você tem alguns exemplos no repositório github do JCDP .

dialex
fonte
33

Tente o seguinte enum:

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

E agora vamos fazer um pequeno exemplo:

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);
    }
}
马哥 私房菜
fonte
2
Esta é uma cópia da resposta stackoverflow.com/a/45444716/675577
dialex
14

Uma maneira bastante portátil de fazer isso é com as seqüências de escape brutas. Veja http://en.wikipedia.org/wiki/ANSI_escape_code

[editado para user9999999 em 20-02-2017]

Java não "manipula os códigos", isso é verdade, mas o Java gera o que você pediu. não é culpa do Java que o console do Windows trate o ESC (chr (27)) como apenas outro glifo (←).

você me fez inicializar no Windows.  você me deve, mano

jcomeau_ictx
fonte
o que não funciona porque a camada Java IO não os converte em cores. System.out.println ((char) 27 + "[31; 1mERROR" + (char) 27 + "[0m" produz apenas "[31; 1mERROR [0m" quando executado em um windows cmd.com como um arquivo executável .jar
simpleuser
a pergunta não foi marcada windows. o console do Windows nunca foi compatível com ANSI que eu lembro.
jcomeau_ictx
mas a questão é que java não está a lidar com os códigos, independentemente do cmd.com apoio
simpleuser
3
veja resposta editada. Java está fazendo exatamente como é dito. o problema é o console não compatível com ANSI.
jcomeau_ictx
1
Estou com o mesmo problema
sgrillon 15/0318
7

Você pode fazer isso usando seqüências de escape ANSI. Na verdade, eu montei essa classe em Java para qualquer pessoa que desejasse uma solução simples para isso. Ele permite mais do que apenas códigos de cores.

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

(Portado de: https://github.com/nathan-fiscaletti/ansi-util )

Exemplo de uso:

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(".")
);
Nathan F.
fonte
6

Se alguém estiver procurando uma solução rápida, fique à vontade para usar a seguinte classe auxiliar :)

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

}

USO:

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

Obrigado @ whiteFang34 pelos códigos ANSI.

Ajmal Salim
fonte
4

A melhor maneira de colorir o texto do console é usar códigos de escape ANSI . Além da cor do texto, os códigos de escape ANSI permitem cores de fundo, decorações e muito mais.

Unix

Se você usa o springboot, há uma enumeração específica para a coloração do texto: org.springframework.boot.ansi.AnsiColor

A biblioteca Jansi é um pouco mais avançada (pode usar todas as funções dos códigos de escape ANSI), fornece uma API e suporta o Windows usando JNA.

Caso contrário, você pode definir manualmente sua própria cor, conforme mostrado em outras respostas.

Windows 10

O Windows 10 (desde a compilação 10.0.10586 - novembro de 2015) suporta códigos de escape ANSI ( documentação do MSDN ), mas não está ativado por padrão. Para habilitá-lo:

  • Com a API SetConsoleMode , use o ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)sinalizador. Jansi usa essa opção.
  • Se a API SetConsoleMode não for usada, é possível alterar a chave de registro global HKEY_CURRENT_USER\Console\VirtualTerminalLevelcriando uma dword e defina-a como 0 ou 1 para o processamento ANSI: "VirtualTerminalLevel"=dword:00000001

Antes do Windows 10

O console do Windows não suporta cores ANSI. Mas é possível usar o console que faz.

NayoR
fonte
1

Usando a função de cor para imprimir texto com cores

Código:

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

Uso:


test {
    println color(Color.CYAN, 'testing')
}
Shadi Abu Hilal
fonte
0

Para strikeout:

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";
Satish M
fonte
-1

A melhor solução para imprimir qualquer texto em vermelho em Java é:

System.err.print("Hello World");
iSahil
fonte
O "voto negativo" não é meu - mas, existem outras respostas que fornecem a pergunta do OP e foram publicadas há algum tempo. Ao postar uma resposta, consulte: Como redigir uma boa resposta? , adicione uma nova solução ou uma explicação substancialmente melhor, especialmente ao responder a perguntas mais antigas.
help-info.de
7
@iSahil isso provavelmente foi diminuído porque simplesmente escrever em erro padrão não explicitamente cora nada. Muitos IDEs e consoles interpretam as mensagens de erro e as imprimem em vermelho ou similar, mas não é algo em que você pode confiar.
David
1
Embora essa não tenha sido a resposta direta à pergunta acima, essa era a resposta que eu procurava ao pesquisar "java print in red console". Assim, sinto que tem o seu lugar nesta página.
Maude
-2

Se você usar o Kotlin (que funciona perfeitamente com Java), poderá criar uma enumeração:

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

E então o uso é o seguinte: (o código abaixo mostra os diferentes estilos para todas as cores)

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

Se estiver executando no Windows em que esses códigos ANSI não são suportados, a isCompatibleverificação evita problemas substituindo os códigos por uma sequência vazia.

Louis CAD
fonte