Jeśli konsola obsługuje (np. Konsolę Eclipse Java) dostosowywanie kolorów stdout / stderr, możesz użyć System.out.println dla jednego koloru i System.err.println dla innego koloru.
jw_
Odpowiedzi:
584
Jeśli twój terminal to obsługuje, możesz użyć kodów ucieczki ANSI, aby użyć koloru na wydruku. Zasadniczo działa dla podpowiedzi powłoki Unix; jednak nie działa w wierszu polecenia systemu Windows (chociaż działa w przypadku Cygwin). Na przykład, możesz zdefiniować takie stałe dla kolorów:
Następnie możesz odwołać się do nich w razie potrzeby.
Na przykład, używając powyższych stałych, możesz wykonać następujący czerwony tekst na obsługiwanych terminalach:
System.out.println(ANSI_RED +"This text is red!"+ ANSI_RESET);
Aktualizacja: możesz sprawdzić bibliotekę Jansi . Zapewnia interfejs API i obsługuje system Windows za pomocą JNI. Jeszcze tego nie próbowałem; wygląda jednak obiecująco.
Aktualizacja 2: Ponadto, jeśli chcesz zmienić kolor tła tekstu na inny kolor, możesz również spróbować:
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 Czy możesz wyjaśnić, po co stosować RESET, jeśli jego kolor jest CZARNY, przynajmniej w mojej konsoli? Czy to jest jak domyślne czy coś?
Boro,
8
@Boro: kod resetowania wyłącza wszystkie ustawione dotychczas atrybuty ANSI, co powinno przywrócić ustawienia domyślne konsoli. Jest to przydatne, jeśli nie znasz domyślnego koloru lub używasz niektórych innych atrybutów, takich jak kolor tła, style czcionek itp.
WhiteFang34
2
jansi jest naprawdę świetny! dla tych, którzy rozwijają się w środowisku Eclipse, mogę polecić tę wtyczkę: mihai-nita.net/2013/06/03/eclipse-plugin-ansi-in-console i ładny kawałek kodu, aby umożliwić kolor, jeśli kod nie jest wykonywany w konsoli:if (System.console() == null) System.setProperty("jansi.passthrough", "true");
Danny Lo
1
@PankajNimgade, przeczytaj odpowiedź jeszcze raz, a może zauważysz to:however it doesn't work for Windows command prompt
Felix Edelmann
1
@DannyLo Dziękuję bardzo za link do wtyczki Eclipse!
Noah Broyles
71
Oto lista kolorów w klasie Java z public staticpolami
Stworzyłem bibliotekę o nazwie JCDP ( Java Colored Debug Printer ).
W systemach Linux, macOS i Windows 10 używa kodów ucieczki ANSI, o których wspomniał WhiteFang, ale wyodrębnia je za pomocą słów zamiast kodów, co jest znacznie bardziej intuicyjne. Staje się tak proste jak:
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;}}
[zredagowano dla użytkownika9999999 dnia 20.02.2017]
Java nie „obsługuje kodów”, to prawda, ale Java wypisuje to, co kazałeś. to nie wina Javy, że konsola Windows traktuje ESC (chr (27)) jak kolejny glif (←).
co nie działa, ponieważ warstwa Java IO nie konwertuje ich na kolory. System.out.println ((char) 27 + "[31; 1mERROR" + (char) 27 + "[0m" daje tylko "[31; 1mERROR [0m") po uruchomieniu z Windows cmd.com jako plik wykonywalny .jar
simpleuser
pytanie nie zostało oznaczone windows. Pamiętam, że konsola Windows nigdy nie była zgodna z ANSI.
jcomeau_ictx
ale problem polega na tym, że java nie obsługuje kodów, niezależnie od wsparcia
cmd.com
3
patrz zredagowana odpowiedź. Java działa dokładnie tak, jak powiedziano. problemem jest konsola niezgodna z ANSI.
jcomeau_ictx
1
Mam ten sam problem
sgrillon
7
Możesz to zrobić za pomocą sekwencji ucieczki ANSI. Właściwie przygotowałem tę klasę w Javie dla każdego, kto chciałby prostego obejścia tego problemu. Pozwala na więcej niż tylko kody kolorów.
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");
Najlepszym sposobem pokolorowania tekstu konsoli jest użycie kodów specjalnych ANSI . Oprócz koloru tekstu, kody ucieczki ANSI pozwalają na kolor tła, dekoracje i więcej.
Biblioteka Jansi jest nieco bardziej zaawansowana (może korzystać ze wszystkich funkcji kodów ucieczkowych ANSI), zapewnia interfejs API i obsługuje system Windows za pomocą JNA.
W przeciwnym razie możesz ręcznie zdefiniować własny kolor, jak pokazano na innych odpowiedziach.
Windows 10
Windows 10 (od wersji 10.0.10586 - listopad 2015) obsługuje kody ucieczki ANSI ( dokumentacja MSDN ), ale domyślnie nie jest włączony. Aby to włączyć:
Jeśli interfejs API SetConsoleMode nie jest używany, można zmienić globalny klucz rejestru HKEY_CURRENT_USER\Console\VirtualTerminalLevel, tworząc dword i ustawiając go na 0 lub 1 dla przetwarzania ANSI:
"VirtualTerminalLevel"=dword:00000001
Przed Windows 10
Konsola Windows nie obsługuje kolorów ANSI. Ale możliwe jest użycie konsoli, która działa.
„Opinia negatywna” nie jest moja - ale istnieją inne odpowiedzi, które dostarczają pytania OP, i zostały opublikowane jakiś czas temu. Publikując odpowiedź zobacz: Jak napisać dobrą odpowiedź? , upewnij się, że dodajesz nowe rozwiązanie lub znacznie lepsze wyjaśnienie, zwłaszcza w przypadku odpowiedzi na starsze pytania.
help-info.de,
7
@ iSilil prawdopodobnie został odrzucony, ponieważ zwykłe pisanie na standardowy błąd niczego nie pokoloruje. Wiele IDE i konsol interpretuje komunikaty o błędach i drukuje je na czerwono lub podobnie, ale na tym nie można polegać.
David
1
Chociaż nie była to bezpośrednia odpowiedź na pytanie zadane powyżej, to była odpowiedź, której szukałem, szukając „druku Java w czerwonej konsoli”. Dlatego wydaje mi się, że ma to miejsce na tej stronie.
Maude
-2
Jeśli używasz Kotlina (który działa płynnie z Javą), możesz zrobić taki wyliczenie:
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""}
A potem użycie jest takie: (kod poniżej pokazuje różne style dla wszystkich kolorów)
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}")}
W przypadku systemu Windows, w którym te kody ANSI nie są obsługiwane, isCompatiblesprawdzenie pozwala uniknąć problemów poprzez zamianę kodów na pusty ciąg znaków.
Odpowiedzi:
Jeśli twój terminal to obsługuje, możesz użyć kodów ucieczki ANSI, aby użyć koloru na wydruku. Zasadniczo działa dla podpowiedzi powłoki Unix; jednak nie działa w wierszu polecenia systemu Windows (chociaż działa w przypadku Cygwin). Na przykład, możesz zdefiniować takie stałe dla kolorów:
Następnie możesz odwołać się do nich w razie potrzeby.
Na przykład, używając powyższych stałych, możesz wykonać następujący czerwony tekst na obsługiwanych terminalach:
Aktualizacja: możesz sprawdzić bibliotekę Jansi . Zapewnia interfejs API i obsługuje system Windows za pomocą JNI. Jeszcze tego nie próbowałem; wygląda jednak obiecująco.
Aktualizacja 2: Ponadto, jeśli chcesz zmienić kolor tła tekstu na inny kolor, możesz również spróbować:
Na przykład:
źródło
if (System.console() == null) System.setProperty("jansi.passthrough", "true");
however it doesn't work for Windows command prompt
Oto lista kolorów w klasie Java z
public static
polamiStosowanie
Uwaga Nie zapomnij użyć opcji
RESET
po wydrukowaniu, ponieważ efekt pozostanie, jeśli nie zostanie usuniętyźródło
Stworzyłem bibliotekę o nazwie JCDP ( Java Colored Debug Printer ).
W systemach Linux, macOS i Windows 10 używa kodów ucieczki ANSI, o których wspomniał WhiteFang, ale wyodrębnia je za pomocą słów zamiast kodów, co jest znacznie bardziej intuicyjne. Staje się tak proste jak:
Masz kilka przykładów w repozytorium github JCDP .
źródło
Spróbuj następującego wyliczenia:
A teraz zrobimy mały przykład:
źródło
Dość przenośnym sposobem na to jest surowe sekwencje ucieczki. Zobacz http://en.wikipedia.org/wiki/ANSI_escape_code
[zredagowano dla użytkownika9999999 dnia 20.02.2017]
Java nie „obsługuje kodów”, to prawda, ale Java wypisuje to, co kazałeś. to nie wina Javy, że konsola Windows traktuje ESC (chr (27)) jak kolejny glif (←).
źródło
windows
. Pamiętam, że konsola Windows nigdy nie była zgodna z ANSI.Możesz to zrobić za pomocą sekwencji ucieczki ANSI. Właściwie przygotowałem tę klasę w Javie dla każdego, kto chciałby prostego obejścia tego problemu. Pozwala na więcej niż tylko kody kolorów.
https://gist.github.com/nathan-fiscaletti/9dc252d30b51df7d710a
(Przeniesiony z: https://github.com/nathan-fiscaletti/ansi-util )
Przykład użycia:
źródło
Jeśli ktoś szuka szybkiego rozwiązania, skorzystaj z następującej klasy pomocników :)
STOSOWANIE:
Dzięki @ whiteFang34 za kody ANSI.
źródło
Najlepszym sposobem pokolorowania tekstu konsoli jest użycie kodów specjalnych ANSI . Oprócz koloru tekstu, kody ucieczki ANSI pozwalają na kolor tła, dekoracje i więcej.
Unix
Jeśli używasz Springboot, istnieje specyficzne wyliczanie dla kolorowania tekstu: org.springframework.boot.ansi.AnsiColor
Biblioteka Jansi jest nieco bardziej zaawansowana (może korzystać ze wszystkich funkcji kodów ucieczkowych ANSI), zapewnia interfejs API i obsługuje system Windows za pomocą JNA.
W przeciwnym razie możesz ręcznie zdefiniować własny kolor, jak pokazano na innych odpowiedziach.
Windows 10
Windows 10 (od wersji 10.0.10586 - listopad 2015) obsługuje kody ucieczki ANSI ( dokumentacja MSDN ), ale domyślnie nie jest włączony. Aby to włączyć:
ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)
flagi. Jansi korzysta z tej opcji.HKEY_CURRENT_USER\Console\VirtualTerminalLevel
, tworząc dword i ustawiając go na 0 lub 1 dla przetwarzania ANSI:"VirtualTerminalLevel"=dword:00000001
Przed Windows 10
Konsola Windows nie obsługuje kolorów ANSI. Ale możliwe jest użycie konsoli, która działa.
źródło
Korzystanie z funkcji koloru do drukowania tekstu w kolorach
Kod:
Stosowanie:
źródło
Aby wykreślić:
źródło
Najlepszym rozwiązaniem do wydrukowania dowolnego tekstu w kolorze czerwonym w Javie jest:
źródło
Jeśli używasz Kotlina (który działa płynnie z Javą), możesz zrobić taki wyliczenie:
A potem użycie jest takie: (kod poniżej pokazuje różne style dla wszystkich kolorów)
W przypadku systemu Windows, w którym te kody ANSI nie są obsługiwane,
isCompatible
sprawdzenie pozwala uniknąć problemów poprzez zamianę kodów na pusty ciąg znaków.źródło