Comment imprimer des couleurs dans la console en utilisant System.out.println?

326

Comment imprimer des couleurs dans la console? Je souhaite afficher les données en couleurs lorsque le processeur envoie des données et en différentes couleurs lorsqu'il reçoit des données.

Taranath Datta
la source
2
Si la console prend en charge (par exemple la console Java Eclipse) la personnalisation de la couleur de stdout / stderr, vous pouvez utiliser System.out.println pour une couleur et System.err.println pour une autre couleur.
jw_

Réponses:

585

Si votre terminal le prend en charge, vous pouvez utiliser des codes d'échappement ANSI pour utiliser la couleur dans votre sortie. Cela fonctionne généralement pour les invites du shell Unix; cependant, cela ne fonctionne pas pour l'invite de commandes Windows (bien que cela fonctionne pour Cygwin). Par exemple, vous pouvez définir des constantes comme celles-ci pour les couleurs:

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

Ensuite, vous pouvez les référencer si nécessaire.

Par exemple, en utilisant les constantes ci-dessus, vous pouvez effectuer la sortie de texte rouge suivante sur les terminaux pris en charge:

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

Mise à jour: vous voudrez peut-être consulter la bibliothèque Jansi . Il fournit une API et prend en charge Windows à l'aide de JNI. Je ne l'ai pas encore essayé; cependant, cela semble prometteur.

Mise à jour 2: En outre, si vous souhaitez modifier la couleur d'arrière-plan du texte en une couleur différente, vous pouvez également essayer les solutions suivantes:

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

Par exemple:

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
la source
1
@ WhiteFang34 Pouvez-vous s'il vous plaît expliquer à quoi sert RESET si sa couleur est NOIRE, du moins dans ma console? Est-ce comme par défaut ou qc.?
Boro
8
@Boro: le code de réinitialisation désactive tous les attributs ANSI définis jusqu'à présent, ce qui devrait ramener la console à ses valeurs par défaut. C'est utile si vous ne connaissez pas la couleur par défaut ou si vous utilisez également certains des autres attributs comme la couleur d'arrière-plan, les styles de police, etc.
WhiteFang34
2
jansi est vraiment génial! pour ceux qui développent dans eclipse, je peux recommander ce plugin: mihai-nita.net/2013/06/03/eclipse-plugin-ansi-in-console et un joli morceau de code pour activer la couleur si le code n'est pas en cours d'exécution dans la console:if (System.console() == null) System.setProperty("jansi.passthrough", "true");
Danny Lo
1
@PankajNimgade, relisez la réponse et vous remarquerez peut-être ceci:however it doesn't work for Windows command prompt
Felix Edelmann
1
@DannyLo Merci beaucoup pour le lien vers le plugin Eclipse!
Noah Broyles
72

Voici une liste de couleurs dans une classe Java avec des public staticchamps

Usage

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


Remarque N'oubliez pas d'utiliser l' RESETafter impression car l'effet restera s'il n'est pas effacé


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
la source
55

J'ai créé une bibliothèque appelée JCDP ( Java Colored Debug Printer ).

Pour Linux, macOS et Windows 10, il utilise les codes d'échappement ANSI mentionnés par WhiteFang, mais les résume en utilisant des mots au lieu de codes, ce qui est beaucoup plus intuitif. Cela devient aussi simple que:

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

Vous avez quelques exemples dans le dépôt github de JCDP .

dialex
la source
33

Essayez l'énumération suivante:

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

Et maintenant, nous allons faire un petit exemple:

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);
    }
}
马哥 私房菜
la source
2
Ceci est une copie de la réponse stackoverflow.com/a/45444716/675577
dialex
14

Une façon assez portable de le faire est avec les séquences d'échappement brutes. Voir http://en.wikipedia.org/wiki/ANSI_escape_code

[modifié pour l'utilisateur9999999 le 20/02/2017]

Java ne "gère pas les codes", c'est vrai, mais Java sort ce que vous lui avez dit de sortir. ce n'est pas la faute de Java si la console Windows traite ESC (chr (27)) comme juste un autre glyphe (←).

tu m'as fait démarrer sur Windows.  tu me dois, mon frère

jcomeau_ictx
la source
ce qui ne fonctionne pas car la couche Java IO ne les convertit pas en couleurs. System.out.println ((char) 27 + "[31; 1mERROR" + (char) 27 + "[0m" ne produit que "[31; 1mERROR [0m" lorsqu'il est exécuté à partir d'une fenêtre cmd.com en tant que fichier exécutable .jar
simpleuser
la question n'a pas été balisée windows. la console Windows n'a jamais été conforme ANSI, si je me souviens bien.
jcomeau_ictx
mais le problème est que java ne gère pas les codes, quel que soit le support de
cmd.com
3
voir la réponse modifiée. Java fait exactement ce qu'on lui dit. le problème est la console non compatible ANSI.
jcomeau_ictx
1
J'ai le même problème
sgrillon
7

Vous pouvez le faire en utilisant des séquences d'échappement ANSI. J'ai en fait mis en place cette classe en Java pour tous ceux qui souhaitent une solution de contournement simple pour cela. Il permet plus que de simples codes couleur.

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

(Porté depuis: https://github.com/nathan-fiscaletti/ansi-util )

Exemple d'utilisation:

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.
la source
6

Si quelqu'un cherche une solution rapide, n'hésitez pas à utiliser la classe d'assistance suivante :)

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

}

USAGE:

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

Merci @ whiteFang34 pour les codes ANSI.

Ajmal Salim
la source
4

La meilleure façon de colorer le texte de la console est d'utiliser les codes d'échappement ANSI . En plus de la couleur du texte, les codes d'échappement ANSI permettent la couleur d'arrière-plan, les décorations et plus encore.

Unix

Si vous utilisez springboot, il existe une énumération spécifique pour la coloration du texte: org.springframework.boot.ansi.AnsiColor

La bibliothèque Jansi est un peu plus avancée (peut utiliser toutes les fonctions des codes d'échappement ANSI), fournit une API et prend en charge Windows avec JNA.

Sinon, vous pouvez définir manuellement votre propre couleur, comme indiqué dans les autres réponses.

Windows 10

Windows 10 (depuis la version 10.0.10586 - novembre 2015) prend en charge les codes d'échappement ANSI ( documentation MSDN ) mais il n'est pas activé par défaut. Pour l'activer:

  • Avec l' API SetConsoleMode , utilisez l' ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)indicateur. Jansi utilise cette option.
  • Si l'API SetConsoleMode n'est pas utilisée, il est possible de modifier la clé de registre globale HKEY_CURRENT_USER\Console\VirtualTerminalLevelen créant un dword et en le définissant sur 0 ou 1 pour le traitement ANSI: "VirtualTerminalLevel"=dword:00000001

Avant Windows 10

La console Windows ne prend pas en charge les couleurs ANSI. Mais il est possible d'utiliser une console qui le fait.

NayoR
la source
1

Utilisation de la fonction couleur pour imprimer du texte avec des couleurs

Code:

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

Usage:


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

Pour barrer:

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
la source
-1

La meilleure solution pour imprimer n'importe quel texte en rouge en Java est:

System.err.print("Hello World");
iSahil
la source
Le «downvote» n'est pas le mien - mais, il y a d'autres réponses qui fournissent la question du PO, et elles ont été publiées il y a quelque temps. Lors de la publication d'une réponse, voir: Comment puis-je écrire une bonne réponse? , assurez-vous d'ajouter une nouvelle solution ou une explication nettement meilleure, en particulier lorsque vous répondez à des questions plus anciennes.
help-info.de
7
@iSahil, cela a probablement été rejeté, car le simple fait d'écrire dans l'erreur standard ne colore rien explicitement. De nombreux IDE et consoles interpréteront les messages d'erreur et les imprimeront en rouge ou similaire, mais ce n'est pas quelque chose sur lequel vous pouvez compter.
David
1
Bien que ce ne soit pas la réponse directe à la question posée ci-dessus, c'était la réponse que je cherchais lors de la recherche de "java print in red console". Ainsi, j'ai l'impression qu'il a sa place sur cette page.
Maude
-2

Si vous utilisez Kotlin (qui fonctionne parfaitement avec Java), vous pouvez créer une telle énumération:

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

Et puis l'utilisation est comme telle: (le code ci-dessous présente les différents styles pour toutes les couleurs)

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

Si vous exécutez sous Windows où ces codes ANSI ne sont pas pris en charge, la isCompatiblevérification évite les problèmes en remplaçant les codes par une chaîne vide.

Louis CAD
la source