Come stampare il colore in console utilizzando System.out.println?


326

Come posso stampare il colore in console? Voglio mostrare i dati a colori quando il processore invia i dati e in colori diversi quando riceve i dati.


2
Se il supporto console (ad es. Console Eclipse Java) personalizza il colore di stdout / stderr, è possibile utilizzare System.out.println per un colore e System.err.println per un altro colore.
jw_

Risposte:


585

Se il terminale lo supporta, è possibile utilizzare i codici di escape ANSI per utilizzare il colore nell'output. Funziona generalmente per i prompt della shell Unix; tuttavia, non funziona per il prompt dei comandi di Windows (anche se funziona per Cygwin). Ad esempio, potresti definire costanti come queste per i colori:

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

Quindi, puoi fare riferimento a quelli necessari.

Ad esempio, utilizzando le costanti precedenti, è possibile creare il seguente output di testo rosso sui terminali supportati:

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

Aggiornamento: potresti voler controllare la libreria Jansi . Fornisce un'API e supporta Windows utilizzando JNI. Non l'ho ancora provato; tuttavia, sembra promettente.

Aggiornamento 2: Inoltre, se si desidera modificare il colore di sfondo del testo in un colore diverso, è possibile provare anche quanto segue:

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

Per esempio:

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 Puoi per favore spiegare a che serve RESET se il suo colore è NERO, almeno nella mia console? È come un valore predefinito o sth.?
Boro,

8
@Boro: il codice di reset disattiva tutti gli attributi ANSI impostati finora, il che dovrebbe riportare la console ai valori predefiniti. È utile se non conosci il colore predefinito o stai usando anche alcuni degli altri attributi come il colore di sfondo, gli stili dei caratteri, ecc.
WhiteFang34

2
jansi è davvero fantastico! per coloro che si sviluppano in eclipse, posso consigliare questo plugin: mihai-nita.net/2013/06/03/eclipse-plugin-ansi-in-console e un bel pezzo di codice per abilitare il colore se il codice non viene eseguito in console:if (System.console() == null) System.setProperty("jansi.passthrough", "true");
Danny Lo

1
@PankajNimgade, leggi di nuovo la risposta e forse noterai questo:however it doesn't work for Windows command prompt
Felix Edelmann

1
@DannyLo Grazie mille per il link al plugin Eclipse!
Noah Broyles,

72

Ecco un elenco di colori in una classe Java con public staticcampi

uso

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


Nota Non dimenticare di usare il RESETdopo stampa poiché l'effetto rimarrà se non viene cancellato


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
}

55

Ho creato una libreria chiamata JCDP ( Java Colored Debug Printer ).

Per Linux, macOS e Windows 10, utilizza i codici di escape ANSI citati da WhiteFang, ma li estrae usando parole anziché codici che sono molto più intuitivi. Diventa facile come:

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

Hai alcuni esempi nel repository github di JCDP .


33

Prova il seguente 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 ora faremo un piccolo esempio:

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

2
Questa è una copia della risposta stackoverflow.com/a/45444716/675577
dialex

14

Un modo abbastanza portatile di farlo è con le sequenze di escape grezze. Vedi http://en.wikipedia.org/wiki/ANSI_escape_code

[modificato per l'utente9999999 il 20/02/2017]

Java non "gestisce i codici", è vero, ma Java emette ciò che gli hai detto di produrre. non è colpa di Java che la console di Windows tratti ESC (chr (27)) come un altro glifo (←).

mi hai fatto avviare Windows.  mi devi, fratello


che non funziona perché il livello I / O Java non li converte in colori. System.out.println ((char) 27 + "[31; 1mERROR" + (char) 27 + "[0m" produce solo "[31; 1mERROR [0m" quando eseguito da Windows cmd.com come eseguibile .jar
simpleuser,

la domanda non è stata taggata windows. la console di Windows non è mai stata conforme ANSI che ricordo.
jcomeau_ictx,

ma il problema è che java non gestisce i codici, indipendentemente dal supporto di
cmd.com

3
vedi risposta modificata. Java sta facendo esattamente come è stato detto. il problema è la console non conforme ANSI.
jcomeau_ictx,

1
Ho lo stesso problema
sgrillon

7

Puoi farlo usando le sequenze di escape ANSI. In realtà ho messo insieme questa classe in Java per chiunque desideri una semplice soluzione per questo. Permette più di semplici codici colore.

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

(Portato da: https://github.com/nathan-fiscaletti/ansi-util )

Esempio di utilizzo:

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

6

Se qualcuno è alla ricerca di una soluzione rapida, sentiti libero di utilizzare la seguente classe di supporto :)

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

Grazie @ whiteFang34 per i codici ANSI.


4

Il modo migliore per colorare il testo della console è utilizzare i codici di escape ANSI . Oltre al colore del testo, i codici di escape ANSI consentono il colore di sfondo, le decorazioni e altro.

Unix

Se usi Springboot, esiste un enum specifico per la colorazione del testo: org.springframework.boot.ansi.AnsiColor

La libreria Jansi è un po 'più avanzata (può usare tutte le funzioni dei codici di escape ANSI), fornisce un'API e ha un supporto per Windows usando JNA.

Altrimenti, puoi definire manualmente il tuo colore, come mostrato nelle altre risposte.

Windows 10

Windows 10 (dalla build 10.0.10586 - novembre 2015) supporta i codici di escape ANSI ( documentazione MSDN ) ma non è abilitato per impostazione predefinita. Per abilitarlo:

  • Con l' API SetConsoleMode , usa ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)flag. Jansi utilizza questa opzione.
  • Se non viene utilizzata l'API SetConsoleMode, è possibile modificare la chiave di registro globale HKEY_CURRENT_USER\Console\VirtualTerminalLevelcreando una dword e impostandola su 0 o 1 per l'elaborazione ANSI: "VirtualTerminalLevel"=dword:00000001

Prima di Windows 10

La console di Windows non supporta i colori ANSI. Ma è possibile utilizzare la console che lo fa.


1

Utilizzo della funzione colore per stampare il testo con i colori

Codice:

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

0

Per eliminare:

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

-1

La migliore soluzione per stampare qualsiasi testo di colore rosso in Java è:

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

Il "downvote" non è mio - ma ci sono altre risposte che forniscono la domanda del PO, e sono state pubblicate qualche tempo fa. Quando invio una risposta, vedi: Come posso scrivere una buona risposta? , assicurati di aggiungere una nuova soluzione o una spiegazione sostanzialmente migliore, soprattutto quando rispondi a domande precedenti.
help-info.de

7
@iSahil questo probabilmente è stato retrocesso perché scrivere semplicemente in un errore standard non colora esplicitamente nulla. Molti IDE e console interpretano i messaggi di errore e li stampano in rosso o simili, ma non è qualcosa su cui puoi fare affidamento.
David

1
Sebbene questa non fosse la risposta diretta alla domanda posta sopra, questa era la risposta che cercavo quando cercavo "java print in red console". Quindi, mi sento come se avesse posto su questa pagina.
Maude

-2

Se usi Kotlin (che funziona perfettamente con Java), puoi creare un tale enum:

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 quindi l'uso è come tale: (il codice seguente mostra i diversi stili per tutti i colori)

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 in esecuzione su Windows in cui questi codici ANSI non sono supportati, il isCompatiblecontrollo evita problemi sostituendo i codici con stringa vuota.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.