Как напечатать цвет в консоли, используя System.out.println?

326

Как я могу напечатать цвет в консоли? Я хочу показать данные в цветах, когда процессор отправляет данные, и в разных цветах, когда он получает данные.

Таранат Датта
источник
2
Если консоль поддерживает (например, консоль Java Eclipse) настройку цвета для stdout / stderr, то вы можете использовать System.out.println для одного цвета и System.err.println для другого цвета.
jw_

Ответы:

585

Если ваш терминал поддерживает это, вы можете использовать управляющие коды ANSI для использования цвета в выходных данных. Обычно это работает для приглашений оболочки Unix; однако, это не работает для командной строки Windows (хотя, это работает для Cygwin). Например, вы можете определить такие константы для цветов:

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

Затем вы можете ссылаться на них по мере необходимости.

Например, используя вышеуказанные константы, вы можете сделать следующий вывод красного текста на поддерживаемых терминалах:

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

Обновление: вы можете проверить библиотеку Янси . Он предоставляет API и поддерживает Windows с использованием JNI. Я еще не пробовал это; Однако это выглядит многообещающе.

Обновление 2: Кроме того, если вы хотите изменить цвет фона текста на другой цвет, вы можете попробовать следующее:

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

Например:

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
источник
1
@ WhiteFang34 Не могли бы вы объяснить, для чего нужен RESET, если его цвет - ЧЕРНЫЙ, по крайней мере, в моей консоли? Это как по умолчанию или что-то еще?
Боро
8
@Boro: код сброса отключает все установленные ранее атрибуты ANSI, что должно вернуть консоли по умолчанию. Это полезно, если вы не знаете цвет по умолчанию или также используете другие атрибуты, такие как цвет фона, стили шрифта и т. Д.
WhiteFang34,
2
Янси действительно здорово! для тех, кто разрабатывает в Eclipse, я могу порекомендовать этот плагин: mihai-nita.net/2013/06/03/eclipse-plugin-ansi-in-console и хороший кусок кода, чтобы включить цвет, если код не выполняется в консоли:if (System.console() == null) System.setProperty("jansi.passthrough", "true");
Дэнни Ло
1
@PankajNimgade, прочитайте ответ снова, и вы, возможно, заметите это:however it doesn't work for Windows command prompt
Феликс Эдельманн
1
@DannyLo Большое спасибо за ссылку на плагин Eclipse!
Ноа Бройлс
72

Вот список цветов в классе Java с public staticполями

использование

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


Примечание Не забудьте использовать RESETпосле печати, так как эффект останется, если он не очищен


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
источник
55

Я создал библиотеку под названием JCDP ( цветной принтер отладки Java ).

Для Linux, macOS и Windows 10 он использует управляющие коды ANSI, упомянутые WhiteFang, но абстрагирует их, используя слова вместо кодов, что гораздо более интуитивно понятно . Это становится так же просто, как:

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

У вас есть несколько примеров в Github-репозитории JCDP .

dialex
источник
33

Попробуйте следующее перечисление:

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

А теперь мы сделаем небольшой пример:

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
Это копия ответа stackoverflow.com/a/45444716/675577
dialex
14

Довольно портативный способ сделать это с помощью необработанных escape-последовательностей. См. Http://en.wikipedia.org/wiki/ANSI_escape_code

[отредактировано для user9999999 2017-02-20]

Java не «обрабатывает коды», это правда, но Java выводит то, что вы сказали, для вывода. Я не виноват в том, что консоль Windows рассматривает ESC (chr (27)) как еще один глиф (←).

ты заставил меня загрузиться в Windows.  ты должен мне, брат

jcomeau_ictx
источник
который не работает, потому что слой Java IO не конвертирует их в цвета. System.out.println ((char) 27 + "[31; 1mERROR" + (char) 27 + "[0m" выдает только "[31; 1mERROR [0m") при запуске из windows cmd.com в качестве исполняемого файла .jar
simpleuser
вопрос не был помечен windows. Я помню, что консоль Windows никогда не была ANSI-совместимой.
jcomeau_ictx
но проблема в том, что java не обрабатывает коды, независимо от поддержки
cmd.com
3
см. отредактированный ответ. Java делает именно так, как было сказано. проблема в несовместимой с ANSI консоли.
jcomeau_ictx
1
У меня та же проблема
sgrillon
7

Вы можете сделать это, используя escape-последовательности ANSI. На самом деле я собрал этот класс в Java для тех, кто хотел бы для этого простого обходного пути. Это позволяет больше, чем просто цветовые коды.

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

(Перенесено с: https://github.com/nathan-fiscaletti/ansi-util )

Пример использования:

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

Если кто-то ищет быстрое решение, не стесняйтесь использовать следующий класс помощника :)

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

}

ИСПОЛЬЗОВАНИЕ:

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

Спасибо @ whiteFang34 за коды ANSI.

Ажмал Салим
источник
4

Лучший способ раскрасить консольный текст - использовать управляющие коды ANSI . Помимо цвета текста, экранирующие коды ANSI допускают цвет фона, декорации и многое другое.

Юникс

Если вы используете springboot, для раскраски текста есть специальное перечисление: org.springframework.boot.ansi.AnsiColor

Библиотека Jansi немного более продвинутая (может использовать все функции управляющих кодов ANSI), предоставляет API и поддерживает Windows с использованием JNA.

В противном случае вы можете вручную определить свой собственный цвет, как показано, другие ответы.

Windows 10

Windows 10 (начиная с версии 10.0.10586 - ноябрь 2015 г.) поддерживает управляющие коды ANSI ( документация MSDN ), но по умолчанию она не включена. Чтобы включить это:

  • С API SetConsoleMode используйтеENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400) флаг. Янси использует эту опцию.
  • Если API-интерфейс SetConsoleMode не используется, можно изменить глобальный раздел реестра HKEY_CURRENT_USER\Console\VirtualTerminalLevel, создав dword и установив его в 0 или 1 для обработки ANSI: "VirtualTerminalLevel"=dword:00000001

До Windows 10

Консоль Windows не поддерживает цвета ANSI. Но можно использовать консоль, которая делает.

NayoR
источник
1

Использование функции цвета для печати текста с цветами

Код:

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

Использование:


test {
    println color(Color.CYAN, 'testing')
}
Шади Абу Хилал
источник
0

Вычеркнуть:

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

Лучшее решение для печати любого текста красным цветом на Java:

System.err.print("Hello World");
iSahil
источник
«Пониженное голосование» не мое, но есть и другие ответы, которые задают вопрос ОП, и они были опубликованы некоторое время назад. При публикации ответа смотрите: Как мне написать хороший ответ? Пожалуйста, убедитесь, что вы добавили либо новое решение, либо существенно лучшее объяснение, особенно когда отвечаете на старые вопросы.
help-info.de
7
@ iSahil это, вероятно, было отвергнуто, потому что простая запись в стандартную ошибку явно ничего не окрашивает. Многие IDE и консоли будут интерпретировать сообщения об ошибках и печатать их красным или похожим цветом, но на это нельзя полагаться.
Дэвид
1
Хотя это не было прямым ответом на вопрос, заданный выше, это был ответ, который я искал, когда искал «java print in red console». Таким образом, я чувствую, что это имеет место на этой странице.
Мод
-2

Если вы используете Kotlin (который без проблем работает с Java), вы можете сделать такое перечисление:

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

И затем использовать как таковой: (код ниже демонстрирует различные стили для всех цветов)

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

При работе в Windows, где эти коды ANSI не поддерживаются, isCompatibleпроверка позволяет избежать проблем, заменяя коды пустой строкой.

Луи САПР
источник