Как цветовая система.из.выходной код println? [дубликат]

этот вопрос уже есть ответ здесь:

Как я могу покрасить вывод Java?

например, в C и других языках я могу использовать ANSI-escape как 3[0m для этого. Но в Java это не работает.

public static void main(String[] x) {
    System.out.println("3[0m BLABLA 3[0mn");
}

13 ответов


нет, но есть сторонние API, которые могут справиться с этим

http://www.javaworld.com/javaworld/javaqa/2002-12/02-qa-1220-console.html

Edit: конечно, есть более новые статьи, чем тот, который я опубликовал, информация все еще жизнеспособна.


Примечание

вы не можете быть в состоянии цвет , но он должен работать во многих Unix (или unix-подобных) терминалах.

кроме того, обратите внимание, что некоторые терминалы просто не будут поддерживать некоторые (если таковые имеются) escape-последовательности ANSI и, особенно, 24-битные цвета.

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

пожалуйста, обратитесь к разделу проклятие внизу для лучшего решения. Для личного или простого решения (хотя не как кросс-платформенное решение), обратитесь к ANSI Escape-последовательности.


TL; DR

  • java: System.out.println((char)27 + "[31m" + "ERROR MESSAGE IN RED");

  • python: print(chr(27) + "[31m" + "ERROR MESSAGE IN RED")

  • Баш или zsh: printf '\x1b[31mERROR MESSAGE IN RED'
    • это также может работать для Os X: printf '\e[31mERROR MESSAGE IN RED'
  • ш: printf 'CTRL+V,CTRL+[[31mERROR MESSAGE IN RED'
    • ie, нажмите CTRL+V а то CTRL+[ для того чтобы получить "сырой" ESC символ, когда интерпретация escape недоступна
    • если все сделано правильно, вы должны увидеть ^[. Хотя это выглядит как два символа, это действительно только один,ESC символ.
    • вы также можете нажать CTRL+V,CTRL+[ на vim в любом из программирования или sripting langauges, потому что это использует литерал ESC символ
    • кроме того, вы можете заменить Ctrl+[ с ESC ... например, вы можете использовать CTRL+V,ESC, но я нахожу первое легче, так как я уже нажимаю CTRL и с [ меньше в сторону.

ANSI Escape-последовательности

фон на Escape-последовательности

хотя это не лучший способ сделать это, самый простой способ сделать это на языке программирования или сценариев-использовать escape-последовательности. Из этой ссылки:

escape-последовательность-это последовательность символов, используемая для изменения состояния компьютеров и подключенных к ним периферийных устройств. Они также известны как управляющие последовательности, отражающие их использование в управлении устройствами.

Backgound на ANSI Escape-последовательности

тем не менее, это становится еще проще, чем в видеотекстовых терминалах, поскольку эти терминалы используют ANSI escape-последовательности. Из этой ссылки:

escape-последовательности ANSI являются стандартом для внутриполосной сигнализации для управления местоположением курсора, цветом и другими параметрами на терминалах видеотекста. Некоторые последовательности байтов, большинство из которых начинаются с Esc и ' [ ' , встроены в текст, который терминал ищет и интерпретирует как команды, а не как коды символов.

как использовать ANSI Escape Последовательности

вообще

  • Escape-последовательности начинаются с escape-символа; для escape-последовательностей ANSI последовательность всегда начинается с ESC (ASCII:27 / hex:0x1B).
  • список того, что вы можете сделать, обратитесь к список Escape-последовательности ANSI в Википедии

Языки Программирования

некоторые языки программирования (например, Java) не будут интерпретируй \e или \x1b как ESC символ. Однако, мы знаем, что символ ASCII 27 is the ESC характер, поэтому мы можем просто typecast 27 до char и используйте это, чтобы начать escape-последовательность.

вот несколько способов сделать это в общем программировании языки:

  • Java

    • System.out.println((char)27 + "[33mYELLOW");
  • Python 3

    • print(chr(27) + "[34mBLUE");
    • print("\x1b[35mMAGENTA");
      • обратите внимание, что \x1b правильно интерпретируется в python
  • узел JS

    • в вслед за Уиллом не вывод цвета в JavaScript в веб-консоли
    • console.log(String.fromCharCode(27) + "[36mCYAN");
    • console.log("\x1b[30;47mBLACK_ON_WHITE");
      • обратите внимание, что \x1b также работает в узле

в командной строке или в сценарии

если вы работаете с Баш или zsh, довольно легко покрасить выход (в большинств стержнях). В Linux, Os X и в некоторых Терминалы окна, вы можете проверить, поддерживает ли ваш терминал цвет, выполнив оба следующих действия:

  • printf '\e[31mRED'
  • printf '\x1b[31mRED'

если вы видите цвет для обоих, то это здорово! Если вы видите цвет только для одного, используйте эту последовательность. Если вы не видите цвета ни для одного из них, то дважды проверьте, чтобы убедиться, что вы набрали все правильно и что вы находитесь в bash или zsh; если вы все еще не видите никакого цвета, то ваш терминал, вероятно, не поддерживает escape-последовательности ANSI.

если я правильно помню, терминалы linux, как правило, поддерживают оба \e и \x1b escape-последовательности, в то время как терминалы os x поддерживают только \e, но я могу ошибаться. Тем не менее, если вы видите что-то вроде следующего изображения, то все готово! (Обратите внимание, что я использую оболочку,zsh, и он окрашивает мою строку приглашения; кроме того, я использую urxvt как мой терминал в Линукс.)

ANSI Escape Sequences Coloring Text Red

"как это работает?" вы можете спросить. Bascially,printf это interpretting последовательность символов, которая следует (все, что внутри одиночные кавычки). Когда printf встречи \e или \x1b, он преобразует эти символы ESC символ (ASCII: 27). Именно этого мы и хотим. Теперь,printf передает ESC31m, и так как есть ESC после действительной escape-последовательности ANSI мы должны получить цветной вывод (если он поддерживается терминалом).

вы также можете использовать echo -e '\e[32mGREEN' (например), для цветной печати. Обратите внимание, что -e флаг echo "[включает] интерпретацию обратных косых черточек" и должен использоваться, если вы хотите echo для правильной интерпретации escape-последовательности.


подробнее о побеге ANSI Последовательности

ANSI escape-последовательности могут делать больше, чем просто вывод цвета, но давайте начнем с этого и посмотрим, как работает цвет; затем мы увидим, как управлять курсором; наконец, мы посмотрим, как использовать 8-битный цвет, а также 24-битный цвет (хотя он имеет только слабую поддержку).

на Википедия, они относятся к ESC[ as CSI, поэтому я сделаю тот же.

цвета

для вывода цвета с помощью ANSI escapes используйте следующее:

  • CSI n m
    • CSI: символ- или ESC[
    • n: номер один из следующих:
      • 30-37, 39: на переднем плане
      • 40-47, 49: фон
    • m: буквальный ASCII m - завершает escape-последовательность

я буду использовать bash или zsh, чтобы продемонстрировать все возможные цветовые комбинации. Plop следующее в bash или zsh, чтобы увидеть для себя (вам может потребоваться заменить \e С \x1b):

  • for fg in {30..37} 39; do for bg in {40..47} 49; do printf "\e[${fg};${bg}m~TEST~"; done; printf "\n"; done;

результат:

various foreground/background colors using ANSI escapes

Краткий Справочник (Цвет)

+~~~~~~+~~~~~~+~~~~~~~~~~~+
|  fg  |  bg  |  color    |
+~~~~~~+~~~~~~+~~~~~~~~~~~+
|  30  |  40  |  black    |
|  31  |  41  |  red      |
|  32  |  42  |  green    |
|  33  |  43  |  yellow   |
|  34  |  44  |  blue     |
|  35  |  45  |  magenta  |
|  36  |  46  |  cyan     |
|  37  |  47  |  white    |
|  39  |  49  |  default  |
+~~~~~~+~~~~~~+~~~~~~~~~~~+

выберите графическое исполнение (SGR)

SGR просто позволяет изменить текст. Многие из них не работают в определенных терминалах, поэтому используйте их экономно в проектах производственного уровня. Однако они могут быть полезны для того, чтобы сделать вывод программы более читаемым или помочь вам различают различные типы вывода.

цвет фактически подпадает под SGR, поэтому синтаксис тот же:

  • CSI n m
    • CSI: символ- или ESC[
    • n: номер один из следующих:
      • 0: сброс
      • 1-9: включает Различный текст эффекты
      • 21-29: отключение различных текстовых эффектов (менее поддерживается, чем 1-9)
      • 30-37, 39: цвет переднего плана
      • 40-47, 49: цвет фона
      • 38: 8 - или 24-битный цвет (см. 8/24-битный цвет ниже)
      • 48: 8 - или 24-битный цвет фона (см. 8/24-битный цвет ниже)
    • m: буквальный ASCII m - завершает escape-последовательность

Хотя существует только слабая поддержка слабого (2), курсив (3), подчеркивание (4), мигание (5,6), обратное видео (7), скрытие (8) и вычеркивание (9), некоторые (но редко все), как правило, работают на терминалах linux и os X.

также стоит отметить, что вы можете разделить любой из вышеперечисленных атрибутов с точка с запятой. Например printf '\e[34;47;1;3mCRAZY TEXT\n' покажет CRAZY TEXT с blue foreground на white background и будет bold и italic.

например:

string attributes together example screenshot

Plop следующее В вашей оболочке bash или zsh, чтобы увидеть все текстовые эффекты, которые вы можете сделать. (Возможно, Вам потребуется заменить \e С \x1b.)

  • for i in {1..9}; do printf "\e[${i}m~TEST~\e[0m "; done

результат:

SGR state 1 SGR state 2

вы можете видеть, что мой терминал поддерживает все текстовые эффекты за исключением на слабый (2), скрыть (8) и зачеркнуть (9).

краткая справка (атрибуты SGR 0-9)

+~~~~~+~~~~~~~~~~~~~~~~~~+
|  n  |  effect          |
+~~~~~+~~~~~~~~~~~~~~~~~~+
|  0  |  reset           |
|  1  |  bold            |
|  2  |  faint*          |
|  3  |  italic**        |
|  4  |  underline       |
|  5  |  slow blink      |
|  6  |  rapid blink*    |
|  7  |  inverse         |
|  8  |  conceal*        |
|  9  |  strikethrough*  |
+~~~~~+~~~~~~~~~~~~~~~~~~+

* not widely supported
** not widely supported and sometimes treated as inverse

8-бит Цвет

хотя большинство терминалов поддерживают это, он менее поддерживается, чем 0-7,9 цвета.

синтаксис:

  • CSI 38;5; n m
    • CSI: символ- или ESC[
    • 38;5;: литеральная строка, которая обозначает использование 8-битных цветов для переднего плана
    • n: номер один из следующий:
      • 0-255

если вы хотите просмотреть все цвета в вашем терминале в хорошем смысле, у меня есть хороший сценарий на gist.github.com.

это выглядит так:

8-bit color example screenshot

если вы хотите изменить фон с помощью 8-битных цветов, просто замените 38 с a 48:

  • CSI 48;5; n m
    • CSI: символ- или ESC[
    • 48;5;: литеральная строка, которая обозначает использование 8-битных цветов для фона
    • n: номер один из следующих:
      • 0-255

24-бит Цвет

также известный как истинный цвет, 24-битный цвет обеспечивает некоторые действительно интересные функции. Поддержка этого определенно растет (насколько я знаю, она работает в большинстве современных терминалов, кроме urxvt мой терминал [вставить злобный смайлик]).

24-битный цвет фактически поддерживается в vim (см. vim wiki чтобы узнать, как включить 24-битные цвета). Это действительно аккуратно, потому что он тянет из colorscheme, определенной для gvim; например, он использует fg / bg от highlight guibg=#______ guifg=#______ для 24-битных цветов! Зашибись, да?

вот как работает 24-битный цвет:

  • CSI 38;2; r ; g ; b m
    • CSI: символ- или ESC[
    • 38;2;: литеральная строка, которая обозначает использование 24-битных цветов для переднего плана
    • r,g,b: числа-каждый должен быть 0-255

проверить несколько из многих цветов, которые вы можете иметь ((2^8)^3 или 2^24 или 16777216 possibilites, я думаю), вы можете использовать это в bash или zsh:

  • for r in 0 127 255; do for g in 0 127 255; do for b in 0 127 255; do printf "\e[38;2;${r};${g};${b}m($r,$g,$b)\e[0m "; done; printf "\n"; done; done;

результат (это в gnome-terminal с urxvt не поддерживает 24-битный цвет ... Соберись!, сопровождающий urxvt ... по-настоящему):

24-bit color example screenshot

если вы хотите 24-битные цвета для фона ... вы угадали! Вы просто замените 38 с 48:

  • CSI 48;2; r ; g ; b m
    • CSI: символ- или ESC[
    • 48;2;: строку, которую обозначает использование 24-битных цветов для фона
    • r,g,b: числа-каждый должен быть 0-255

Вставка Необработанных Escape-Последовательностей

иногда \e и \x1b не будет работать. Например, в ш shell, иногда ни работает (хотя это делает на моей системе теперь, я не думаю, что раньше).

чтобы обойти это, вы можете использовать CTRL+V,CTRL+[ или CTRLV,ESC

это вставит "raw"ESC символ (ASCII: 27). Это будет выглядеть так ^[, но не волнуйтесь, это только один персонаж-не два.

например:

sh raw escape char example screenshot


проклятие

относятся к проклятия (библиотека программирования) страница для полной ссылки на проклятия. Следует отметить, что curses работает только на unix и unix-подобных операционных системах.

вверх и работает с проклятиями

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

зачем использовать проклятия над побегами ANSI?

если Вы читаете приведенный выше текст, вы можете вспомнить, что \e или \x1b иногда будет работать с printf. Ну, иногда ... --14--> и \x1b не будет работать вообще (это не стандарт и я никогда не работал с терминалом, как это, но это возможно). Что еще более важно, более сложные escape-последовательности (подумайте дома и другие многосимвольные ключи) трудно поддерживать для каждого терминала (если вы не хотите тратить много времени и усилий на разбор terminfo и termcap и выяснение того, как обрабатывать каждый терминал).

Curses решает эту проблему. В принципе, он способен понять, какие возможности имеет терминал, используя эти методы (как описано в статье Википедии, связанной выше):

большинство реализаций проклятий используют базу данных, которая может опишите возможности тысяч различных терминалов. Есть несколько реализаций, таких как PDCurses, которые используют специализированные драйверы устройств, а не базу данных терминала. Большинство реализаций используют terminfo; некоторые используют termcap. Проклятия имеют преимущество back-portability к стержням характер-клетки и простоте. Для приложения, которое не требует битовой графики или нескольких шрифтов, реализация интерфейса с использованием проклятий обычно будет намного проще и быстрее, чем один с помощью X инструментария.

большую часть времени проклятия будут опрашивать terminfo, а затем смогут понять, как манипулировать атрибутами курсора и текста. Затем вы, программист, используете API, предоставляемый curses для управления курсором или изменения цвета текста или других атрибутов, если требуется функциональность, которую вы ищете.

пример с Python

я считаю, что python очень прост в использовании, но если вы хотите использовать проклятия в другом язык программирования, а затем просто искать его на duckduckgo или любой другой поисковой системы. :) Вот краткий пример в python 3:

import curses

def main(stdscr):
    # allow curses to use default foreground/background (39/49)
    curses.use_default_colors()

    # Clear screen
    stdscr.clear()

    curses.init_pair(1, curses.COLOR_RED, -1)
    curses.init_pair(2, curses.COLOR_GREEN, -1)
    stdscr.addstr("ERROR: I like tacos, but I don't have any.\n", curses.color_pair(1))
    stdscr.addstr("SUCCESS: I found some tacos.\n", curses.color_pair(2))

    stdscr.refresh() # make sure screen is refreshed
    stdscr.getkey()  # wait for user to press key

if __name__ == '__main__':
    curses.wrapper(main)

результат:

enter image description here

вы можете подумать, что это гораздо более круглый способ делать вещи, но на самом деле это гораздо более кросс-платформенный (действительно кросс-терминал ... по крайней мере, в мире unix - и unix-подобных платформ). Для цветов, это не совсем as важно, но когда дело доходит до поддержки других escape-последовательностей с несколькими последовательностями (например,дома, конец, Страница, Страницы и т. д.), Тогда проклятия становятся все более важными.

пример с Tput

  • tput - утилита командной строки для управления курсором и текстом
  • tput входит в curses пакета. Если вы хотите использовать кросс-терминал (ish) приложения в терминале вы должны использовать tput, поскольку он анализирует terminfo или все, что ему нужно, и использует набор стандартизированных команд (например, проклятия) и возвращает правильную escape-последовательность.
  • пример:
echo "$(tput setaf 1)$(tput bold)ERROR:$(tput sgr0)$(tput setaf 1) My tacos have gone missing"
echo "$(tput setaf 2)$(tput bold)SUCCESS:$(tput sgr0)$(tput setaf 2) Oh good\! I found my tacos\!"

результат:

example with tput

дополнительная информация о Tput


это сработало для меня:

System.out.println((char)27 + "[31mThis text would show up red" + (char)27 + "[0m");

вам нужно окончание "[37m", чтобы вернуть цвет в белый (или что бы вы ни использовали). Если вы этого не сделаете, это может сделать все, что следует за "красным".


можно использовать JANSI библиотека для отображения escape-последовательностей ANSI в Windows.


Да это 100% возможно

set classpath= %classpath%;d:\jansi-1.4 - ... jar;

попробуйте этот код ниже:

import org.fusesource.jansi.AnsiConsole;
import static org.fusesource.jansi.Ansi.*;
import static org.fusesource.jansi.Ansi.Color.*;

public class Sample

{

  public static void main(String[] args)
  {
    AnsiConsole.systemInstall();

    System.out.println(ansi().fg(RED).a("Hello World").reset());
    System.out.println("My Name is Raman");

    AnsiConsole.systemUninstall();
  }
}

вот решение для консоли Win32.

1) Получить библиотеки JavaNativeAccess здесь:https://github.com/twall/jna/

2) Эти два класса Java сделают трюк.

наслаждайтесь.

package com.stackoverflow.util;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Structure;

public class Win32 {
    public static final int STD_INPUT_HANDLE = -10;
    public static final int STD_OUTPUT_HANDLE = -11;
    public static final int STD_ERROR_HANDLE = -12;

    public static final short CONSOLE_FOREGROUND_COLOR_BLACK        = 0x00;
    public static final short CONSOLE_FOREGROUND_COLOR_BLUE         = 0x01;
    public static final short CONSOLE_FOREGROUND_COLOR_GREEN        = 0x02;
    public static final short CONSOLE_FOREGROUND_COLOR_AQUA         = 0x03;
    public static final short CONSOLE_FOREGROUND_COLOR_RED          = 0x04;
    public static final short CONSOLE_FOREGROUND_COLOR_PURPLE       = 0x05;
    public static final short CONSOLE_FOREGROUND_COLOR_YELLOW       = 0x06;
    public static final short CONSOLE_FOREGROUND_COLOR_WHITE        = 0x07;
    public static final short CONSOLE_FOREGROUND_COLOR_GRAY         = 0x08;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_BLUE   = 0x09;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_GREEN  = 0x0A;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_AQUA   = 0x0B;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_RED    = 0x0C;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_PURPLE = 0x0D;
    public static final short CONSOLE_FOREGROUND_COLOR_LIGHT_YELLOW = 0x0E;
    public static final short CONSOLE_FOREGROUND_COLOR_BRIGHT_WHITE = 0x0F;

    public static final short CONSOLE_BACKGROUND_COLOR_BLACK        = 0x00;
    public static final short CONSOLE_BACKGROUND_COLOR_BLUE         = 0x10;
    public static final short CONSOLE_BACKGROUND_COLOR_GREEN        = 0x20;
    public static final short CONSOLE_BACKGROUND_COLOR_AQUA         = 0x30;
    public static final short CONSOLE_BACKGROUND_COLOR_RED          = 0x40;
    public static final short CONSOLE_BACKGROUND_COLOR_PURPLE       = 0x50;
    public static final short CONSOLE_BACKGROUND_COLOR_YELLOW       = 0x60;
    public static final short CONSOLE_BACKGROUND_COLOR_WHITE        = 0x70;
    public static final short CONSOLE_BACKGROUND_COLOR_GRAY         = 0x80;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_BLUE   = 0x90;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_GREEN  = 0xA0;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_AQUA   = 0xB0;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_RED    = 0xC0;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_PURPLE = 0xD0;
    public static final short CONSOLE_BACKGROUND_COLOR_LIGHT_YELLOW = 0xE0;
    public static final short CONSOLE_BACKGROUND_COLOR_BRIGHT_WHITE = 0xF0;

    // typedef struct _COORD {
    //    SHORT X;
    //    SHORT Y;
    //  } COORD, *PCOORD;
    public static class COORD extends Structure {
        public short X;
        public short Y;
    }

    // typedef struct _SMALL_RECT {
    //    SHORT Left;
    //    SHORT Top;
    //    SHORT Right;
    //    SHORT Bottom;
    //  } SMALL_RECT;
    public static class SMALL_RECT extends Structure {
        public short Left;
        public short Top;
        public short Right;
        public short Bottom;
    }

    // typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
    //    COORD      dwSize;
    //    COORD      dwCursorPosition;
    //    WORD       wAttributes;
    //    SMALL_RECT srWindow;
    //    COORD      dwMaximumWindowSize;
    //  } CONSOLE_SCREEN_BUFFER_INFO;
    public static class CONSOLE_SCREEN_BUFFER_INFO extends Structure {
        public COORD dwSize;
        public COORD dwCursorPosition;
        public short wAttributes;
        public SMALL_RECT srWindow;
        public COORD dwMaximumWindowSize;
    }

    // Source: https://github.com/twall/jna/nonav/javadoc/index.html
    public interface Kernel32 extends Library {
        Kernel32 DLL = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);

        // HANDLE WINAPI GetStdHandle(
        //        __in  DWORD nStdHandle
        //      );
        public int GetStdHandle(
                int nStdHandle);

        // BOOL WINAPI SetConsoleTextAttribute(
        //        __in  HANDLE hConsoleOutput,
        //        __in  WORD wAttributes
        //      );
        public boolean SetConsoleTextAttribute(
                int in_hConsoleOutput, 
                short in_wAttributes);

        // BOOL WINAPI GetConsoleScreenBufferInfo(
        //        __in   HANDLE hConsoleOutput,
        //        __out  PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
        //      );
        public boolean GetConsoleScreenBufferInfo(
                int in_hConsoleOutput,
                CONSOLE_SCREEN_BUFFER_INFO out_lpConsoleScreenBufferInfo);

        // DWORD WINAPI GetLastError(void);
        public int GetLastError();
    }
}
package com.stackoverflow.util;

import java.io.PrintStream;

import com.stackoverflow.util.Win32.Kernel32;

public class ConsoleUtil {
    public static void main(String[] args)
    throws Exception {
        System.out.print("abc");
        static_color_print(
                System.out, 
                "def", 
                Win32.CONSOLE_BACKGROUND_COLOR_RED, 
                Win32.CONSOLE_FOREGROUND_COLOR_BRIGHT_WHITE);
        System.out.print("def");
        System.out.println();
    }

    private static Win32.CONSOLE_SCREEN_BUFFER_INFO _static_console_screen_buffer_info = null; 

    public static void static_save_settings() {
        if (null == _static_console_screen_buffer_info) {
            _static_console_screen_buffer_info = new Win32.CONSOLE_SCREEN_BUFFER_INFO();
        }
        int stdout_handle = Kernel32.DLL.GetStdHandle(Win32.STD_OUTPUT_HANDLE);
        Kernel32.DLL.GetConsoleScreenBufferInfo(stdout_handle, _static_console_screen_buffer_info);
    }

    public static void static_restore_color()
    throws Exception {
        if (null == _static_console_screen_buffer_info) {
            throw new Exception("Internal error: Must save settings before restore");
        }
        int stdout_handle = Kernel32.DLL.GetStdHandle(Win32.STD_OUTPUT_HANDLE);
        Kernel32.DLL.SetConsoleTextAttribute(
                stdout_handle, 
                _static_console_screen_buffer_info.wAttributes);
    }

    public static void static_set_color(Short background_color, Short foreground_color) {
        int stdout_handle = Kernel32.DLL.GetStdHandle(Win32.STD_OUTPUT_HANDLE);
        if (null == background_color || null == foreground_color) {
            Win32.CONSOLE_SCREEN_BUFFER_INFO console_screen_buffer_info = 
                new Win32.CONSOLE_SCREEN_BUFFER_INFO();
            Kernel32.DLL.GetConsoleScreenBufferInfo(stdout_handle, console_screen_buffer_info);
            short current_bg_and_fg_color = console_screen_buffer_info.wAttributes;
            if (null == background_color) {
                short current_bg_color = (short) (current_bg_and_fg_color / 0x10);
                background_color = new Short(current_bg_color);
            }
            if (null == foreground_color) {
                short current_fg_color = (short) (current_bg_and_fg_color % 0x10);
                foreground_color = new Short(current_fg_color);
            }
        }
        short bg_and_fg_color = 
            (short) (background_color.shortValue() | foreground_color.shortValue());
        Kernel32.DLL.SetConsoleTextAttribute(stdout_handle, bg_and_fg_color);
    }

    public static<T> void static_color_print(
            PrintStream ostream, 
            T value, 
            Short background_color, 
            Short foreground_color)
    throws Exception {
        static_save_settings();
        try {
            static_set_color(background_color, foreground_color);
            ostream.print(value);
        }
        finally {
            static_restore_color();
        }
    }

    public static<T> void static_color_println(
            PrintStream ostream, 
            T value, 
            Short background_color, 
            Short foreground_color)
    throws Exception {
        static_save_settings();
        try {
            static_set_color(background_color, foreground_color);
            ostream.println(value);
        }
        finally {
            static_restore_color();
        }
    }
}

Я создал jar библиотека JCDP (Java Цветной Отладочный Принтер).

для Linux он использует escape-коды ANSI, упомянутые WhiteFang, но абстрагирует их, используя слова вместо кодов, которые гораздо более интуитивно понятны.

для Windows он фактически включает библиотеку JAnsi, но создает над ней слой абстракции, поддерживая интуитивно понятный и простой интерфейс, созданный для Linux.

эта библиотека распространяется под лицензией the Лицензия MIT Так что не стесняйтесь использовать его.

посмотреть репозиторий GitHub JCDP.


самый простой способ-запустить вашу программу (немодифицированную)в консоли Cygwin.

второй простейший метод-запустить программу (также немодифицированную) в обычной консоли Windows, конвейеризуя ее вывод через tee.exe (из дистрибутива Cygwin или Git). Тройник.exe распознает escape-коды и вызовет соответствующие функции WinAPI.

что-то типа:

java MyClass | tee.exe log.txt
java MyClass | tee.exe /dev/null

Escape-последовательности должны быть интерпретированы чем-то, чтобы быть преобразованы в цвет. Стандартный CMD.EXE, используемый java при запуске из командной строки, не поддерживает это, поэтому Java этого не делает.


проверьте это: я использовал значения ANSI с escape-кодом, и он, вероятно, не работает в командной строке windows, но в IDEs и Unix shell. вы также можете проверить библиотеку "Jansi"здесь для поддержки windows.

System.out.println("\u001B[35m" + "This text is PURPLE!" + "\u001B[0m");

Я написал библиотеку под названием AnsiScape что позволяет писать цветные выходные данные более структурированным образом:

пример:

AnsiScape ansiScape = new AnsiScape();
String colors = ansiScape.format("{red {blueBg Red text with blue background}} {b Bold text}");
System.out.println(colors);

библиотека он также позволяет определить свои собственные "escape-классы" сродни классам css.

пример:

AnsiScapeContext context = new AnsiScapeContext();

// Defines a "class" for text
AnsiClass text = AnsiClass.withName("text").add(RED);
// Defines a "class" for the title used
AnsiClass title = AnsiClass.withName("title").add(BOLD, BLUE_BG, YELLOW);
// Defines a "class" to render urls
AnsiClass url = AnsiClass.withName("url").add(BLUE, UNDERLINE);

// Registering the classes to the context
context.add(text).add(title).add(url);

// Creating an AnsiScape instance with the custom context
AnsiScape ansiScape = new AnsiScape(context);

String fmt = "{title Chapter 1}\n" +
              "{text So it begins:}\n" +
              "- {text Option 1}\n" +
              "- {text Url: {url www.someurl.xyz}}";

System.out.println(ansiScape.format(fmt));

это работает в eclipse, чтобы сделать его красным, не знаю о других местах.

System.err.println(" BLABLA ");