¿Cómo imprimir color en la consola usando System.out.println?

326

¿Cómo puedo imprimir en color en la consola? Quiero mostrar datos en colores cuando el procesador envía datos y en diferentes colores cuando recibe datos.

Taranath Datta
fuente
2
Si la consola admite (por ejemplo, la consola Eclipse Java) personalizar el color de stdout / stderr, puede usar System.out.println para un color y System.err.println para otro color.
jw_

Respuestas:

585

Si su terminal lo admite, puede usar códigos de escape ANSI para usar color en su salida. Generalmente funciona para los avisos de shell de Unix; sin embargo, no funciona para el símbolo del sistema de Windows (aunque sí funciona para Cygwin). Por ejemplo, podría definir constantes como estas para los colores:

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

Luego, puede hacer referencia a ellos según sea necesario.

Por ejemplo, usando las constantes anteriores, puede hacer la siguiente salida de texto rojo en terminales compatibles:

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

Actualización: es posible que desee consultar la biblioteca Jansi . Proporciona una API y tiene soporte para Windows usando JNI. No lo he probado todavía; Sin embargo, parece prometedor.

Actualización 2: Además, si desea cambiar el color de fondo del texto a un color diferente, también puede intentar lo siguiente:

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 ejemplo:

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
fuente
1
@ WhiteFang34 ¿Puede explicar de qué sirve RESET si su color es NEGRO, al menos en mi consola? ¿Es como un valor predeterminado o algo?
Boro
8
@Boro: el código de reinicio desactiva todos los atributos ANSI establecidos hasta ahora, lo que debería devolver la consola a sus valores predeterminados. Es útil si usted no sabe el color predeterminado o está utilizando algunos de los otros atributos como el color de fondo, estilos de fuente, etc
WhiteFang34
2
jansi es realmente genial! para aquellos que se desarrollan en eclipse, puedo recomendar este complemento: mihai-nita.net/2013/06/03/eclipse-plugin-ansi-in-console y un buen fragmento de código para habilitar el color si el código no se está ejecutando en consola:if (System.console() == null) System.setProperty("jansi.passthrough", "true");
Danny Lo
1
@PankajNimgade, lee la respuesta nuevamente y tal vez te darás cuenta de esto:however it doesn't work for Windows command prompt
Felix Edelmann
1
@DannyLo ¡Muchas gracias por el enlace al complemento Eclipse!
Noah Broyles
72

Aquí hay una lista de colores en una clase Java con public staticcampos

Uso

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


Nota No olvide utilizar RESETdespués de la impresión ya que el efecto permanecerá si no se borra


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
fuente
55

Creé una biblioteca llamada JCDP ( Impresora de depuración de color Java ).

Para Linux, macOS y Windows 10, utiliza los códigos de escape ANSI que mencionó WhiteFang, pero los resume usando palabras en lugar de códigos, lo que es mucho más intuitivo. Se vuelve tan fácil como:

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

Tienes algunos ejemplos en el repositorio github de JCDP .

dialex
fuente
33

Pruebe la siguiente enumeración:

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

Y ahora haremos un pequeño ejemplo:

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);
    }
}
马哥 私房菜
fuente
2
Esta es una copia de la respuesta stackoverflow.com/a/45444716/675577
dialex
14

Una forma bastante portátil de hacerlo es con las secuencias de escape sin procesar. Ver http://en.wikipedia.org/wiki/ANSI_escape_code

[editado por user9999999 el 2017-02-20]

Java no "maneja los códigos", eso es cierto, pero Java genera lo que usted le dijo que emitiera. No es culpa de Java que la consola de Windows trate a ESC (chr (27)) como un glifo más (←).

me hiciste arrancar en Windows.  me debes hermano

jcomeau_ictx
fuente
que no funciona porque la capa Java IO no los convierte en colores. System.out.println ((char) 27 + "[31; 1mERROR" + (char) 27 + "[0m" solo produce "[31; 1mERROR [0m" cuando se ejecuta desde un cmd.com de Windows como un archivo ejecutable .jar
simpleuser
La pregunta no fue etiquetada windows. la consola de Windows nunca cumplió con ANSI que yo recuerde.
jcomeau_ictx
pero el problema es que Java no es el manejo de los códigos, independientemente de cmd.com de apoyo
simpleuser
3
ver la respuesta editada Java está haciendo exactamente lo que se le dice. El problema es la consola no compatible con ANSI.
jcomeau_ictx
1
Tengo el mismo problema
sgrillon
7

Puede hacer esto usando secuencias de escape ANSI. De hecho, he reunido esta clase en Java para cualquiera que desee una solución simple para esto. Permite más que solo códigos de colores.

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

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

Ejemplo 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.
fuente
6

Si alguien está buscando una solución rápida, siéntase libre de usar la siguiente clase 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");

Gracias @ whiteFang34 por los códigos ANSI.

Ajmal Salim
fuente
4

La mejor manera de colorear el texto de la consola es usar códigos de escape ANSI . Además del color del texto, los códigos de escape ANSI permiten el color de fondo, decoraciones y más.

Unix

Si usa springboot, hay una enumeración específica para colorear texto: org.springframework.boot.ansi.AnsiColor

La biblioteca Jansi es un poco más avanzada (puede usar todas las funciones de códigos de escape ANSI), proporciona una API y tiene soporte para Windows usando JNA.

De lo contrario, puede definir manualmente su propio color, como se muestra en otras respuestas.

Windows 10

Windows 10 (desde la compilación 10.0.10586 - noviembre de 2015) admite códigos de escape ANSI ( documentación de MSDN ) pero no está habilitado de forma predeterminada. Para habilitarlo:

  • Con la API SetConsoleMode , use ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)flag. Jansi usa esta opción.
  • Si no se utiliza la API SetConsoleMode, es posible cambiar la clave de registro global HKEY_CURRENT_USER\Console\VirtualTerminalLevelcreando una palabra d y establecerla en 0 o 1 para el procesamiento ANSI: "VirtualTerminalLevel"=dword:00000001

Antes de Windows 10

La consola de Windows no admite colores ANSI. Pero es posible usar la consola que lo hace.

NayoR
fuente
1

Usar la función de color para imprimir texto con colores

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
fuente
0

Para ponchar:

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
fuente
-1

La mejor solución para imprimir cualquier texto en color rojo en Java es:

System.err.print("Hello World");
iSahil
fuente
El "voto negativo" no es mío, pero hay otras respuestas que proporcionan la pregunta del OP, y se publicaron hace algún tiempo. Cuando publique una respuesta, vea: ¿Cómo escribo una buena respuesta? , asegúrese de agregar una nueva solución o una explicación sustancialmente mejor, especialmente al responder preguntas anteriores.
help-info.de
77
@iSahil esto probablemente fue rechazado porque simplemente escribir en un error estándar no colorea explícitamente nada. Muchos IDEs y consolas interpretarán los mensajes de error y los imprimirán en rojo o similar, pero eso no es algo en lo que pueda confiar.
David
1
Si bien esta no era la respuesta directa a la pregunta anterior, esta era la respuesta que estaba buscando cuando buscaba "Java Print en la consola roja". Por lo tanto, siento que tiene su lugar en esta página.
Maude
-2

Si usa Kotlin (que funciona a la perfección con Java), puede hacer tal enumeración:

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

Y luego el uso es como tal: (el siguiente código muestra los diferentes estilos para todos los colores)

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 se ejecuta en Windows donde estos códigos ANSI no son compatibles, la isCompatibleverificación evita problemas al reemplazar los códigos con una cadena vacía.

Louis CAD
fuente