Як надрукувати колір у консолі за допомогою System.out.println?


324

Як можна друкувати кольори в консолі? Я хочу показати дані кольорами, коли процесор надсилає дані, і в різних кольорах, коли він отримує дані.


2
Якщо підтримка консолі (наприклад, консоль Eclipse Java) налаштовує колір stdout / stderr, ви можете використовувати System.out.println для одного кольору та System.err.println для іншого кольору.
jw_

Відповіді:


584

Якщо ваш термінал підтримує його, ви можете використовувати 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);

Оновлення: Ви можете перевірити бібліотеку Jansi . Він надає 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);

1
@ WhiteFang34 Чи можете ви поясніть, в чому полягає використання RESET, якщо його колір ЧЕРНИЙ, принаймні на моїй консолі? Це як дефолт або що-небудь.?
Боро

8
@Boro: код скидання вимикає всі встановлені до цього часу атрибути ANSI, які повинні повернути консоль до значень за замовчуванням. Це корисно, якщо ви не знаєте колір за замовчуванням або також використовуєте деякі інші атрибути, такі як колір тла, стилі шрифту тощо
WhiteFang34

2
jansi - це справді чудово! для тих, хто розвивається у затемненні, я можу рекомендувати цей плагін: mihai-nita.net/2013/06/03/eclipse-plugin-ansi-in-console та гарний фрагмент коду, щоб увімкнути колір, якщо код не виконується в консолі:if (System.console() == null) System.setProperty("jansi.passthrough", "true");
Danny Lo

1
@PankajNimgade, прочитайте відповідь ще раз, і, можливо, ви помітите це:however it doesn't work for Windows command prompt
Фелікс Едельман

1
@DannyLo Дякую вам за посилання на плагін Eclipse!
Ной Бройлес

71

Ось список кольорів у класі 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
}

55

Я створив бібліотеку під назвою JCDP ( Java Colored Debug Printer ).

Для Linux, macOS та Windows 10 він використовує коди аварійних відхилень ANSI, про які згадував WhiteFang, але резюмує їх, використовуючи слова замість кодів, що значно інтуїтивніше. Це стає так само просто, як:

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

У вас є кілька прикладів у сховищі github JCDP .


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

Досить портативний спосіб зробити це з необробленими послідовностями втечі. Дивіться http://en.wikipedia.org/wiki/ANSI_escape_code

[відредаговано для користувача9999999 2017-02-20]

Java не "обробляє коди", це правда, але Java виводить те, що ви їй сказали для виведення. Не винна Java, що консоль Windows трактує ESC (chr (27)) як лише черговий гліф (←).

ти змусив мене завантажитися в Windows.  ти мені завдячуєш, брате


що не працює, оскільки шар IO Java не перетворює їх у кольори. 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
simpleuser

3
див. відредаговану відповідь. Java робить саме так, як сказано. проблема - консоль, яка не відповідає стандарту ANSI.
jcomeau_ictx

1
У мене
така

7

Ви можете зробити це, використовуючи послідовності втечі 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-коди втечі дозволяють використовувати колір тла, прикраси тощо.

Unix

Якщо ви використовуєте 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, створивши слово і встановити його на 0 або 1 для обробки ANSI: "VirtualTerminalLevel"=dword:00000001

Перед Windows 10

Консоль Windows не підтримує кольори ANSI. Але можна використовувати консоль, яка це робить.


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

"Оголошення" не є моїм, але є й інші відповіді, які забезпечують питання ОП, і вони були опубліковані деякий час тому. Опублікувавши відповідь, див.: Як написати гарну відповідь? , переконайтеся, що ви додали або нове рішення, або істотно краще пояснення, особливо, відповідаючи на старіші запитання.
help-info.de

7
@iSahil це, ймовірно, було сприйнято тому, що просто записування до стандартної помилки явно нічого не забарвлює. Багато IDE та консолей будуть інтерпретувати повідомлення про помилки та друкувати їх червоним чи подібним, але на це не можна покластися.
Девід

1
Хоча це не була прямою відповіддю на питання, задане вище, це була відповідь, яку я шукав під час пошуку "друку Java в червоній консолі". Таким чином, я відчуваю, що це місце на цій сторінці.
Моде

-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перевірка дозволяє уникнути неполадок, замінивши коди порожнім рядком.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.