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.
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:
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:
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 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
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:
enumColor{//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");// WHITEprivatefinalString code;Color(String code){this.code = code;}@OverridepublicString toString(){return code;}}
Et maintenant, nous allons faire un petit exemple:
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 (←).
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.
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");
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.
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.
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:
enumclassAnsiColor(private val colorNumber:Byte){
BLACK(0), RED(1), GREEN(2), YELLOW(3), BLUE(4), MAGENTA(5), CYAN(6), WHITE(7);
companion object {privateconst 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.
Réponses:
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:
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:
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:
Par exemple:
la source
if (System.console() == null) System.setProperty("jansi.passthrough", "true");
however it doesn't work for Windows command prompt
Voici une liste de couleurs dans une classe Java avec des
public static
champsUsage
Remarque N'oubliez pas d'utiliser l'
RESET
after impression car l'effet restera s'il n'est pas effacéla source
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:
Vous avez quelques exemples dans le dépôt github de JCDP .
la source
Essayez l'énumération suivante:
Et maintenant, nous allons faire un petit exemple:
la source
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 (←).
la source
windows
. la console Windows n'a jamais été conforme ANSI, si je me souviens bien.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:
la source
Si quelqu'un cherche une solution rapide, n'hésitez pas à utiliser la classe d'assistance suivante :)
USAGE:
Merci @ whiteFang34 pour les codes ANSI.
la source
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:
ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)
indicateur. Jansi utilise cette option.HKEY_CURRENT_USER\Console\VirtualTerminalLevel
en 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.
la source
Utilisation de la fonction couleur pour imprimer du texte avec des couleurs
Code:
Usage:
la source
Pour barrer:
la source
La meilleure solution pour imprimer n'importe quel texte en rouge en Java est:
la source
Si vous utilisez Kotlin (qui fonctionne parfaitement avec Java), vous pouvez créer une telle énumération:
Et puis l'utilisation est comme telle: (le code ci-dessous présente les différents styles pour toutes les couleurs)
Si vous exécutez sous Windows où ces codes ANSI ne sont pas pris en charge, la
isCompatible
vérification évite les problèmes en remplaçant les codes par une chaîne vide.la source