Frage

    

Diese Frage bereits eine Antwort hier:

         

Wie kann ich Java Ausgabe färben?

Zum Beispiel in C und anderen Sprachen kann ich ANSI-Escape wie \033[0m, dies zu tun. Aber in Java funktioniert es nicht.

public static void main(String[] x) {
    System.out.println("\033[0m BLABLA \033[0m\n");
}
War es hilfreich?

Lösung

Nein, aber es gibt Dritten API, die es verarbeiten kann

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

Edit: natürlich gibt es neue Artikel als jene, die ich geschrieben, die Informationen aber immer noch lebensfähig ist

.

Andere Tipps

Hinweis

Sie können nicht in der Lage sein Fensters cmd prompt zu färben, aber es sollte in vielen Unix (oder Unix-artig) Terminals arbeiten.

Beachten Sie auch, dass einige Terminals einfach nicht einige unterstützen (falls vorhanden) ANSI Escape-Sequenzen und vor allem 24-Bit-Farben.

Verwendung

Bitte beachten Sie den Abschnitt Flüche an der Unterseite für die beste Lösung. Für eine persönliche oder einfache Lösung (obwohl nicht als Cross-Plattform-Lösung), beziehen sich auf die ANSI Escape-Sequenzen .


TL; DR

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

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

  • bash oder zsh : printf '\x1b[31mERROR MESSAGE IN RED'
    • dies kann auch arbeiten für Os X: printf '\e[31mERROR MESSAGE IN RED'
  • sh : printf ' STRG + V , STRG + [ [31mERROR MESSAGE IN RED'
    • dh, drücken Sie STRG + V und dann STRG + [, um eine "rohe" zu bekommen ESC Zeichen, wenn Flucht Interpretation nicht verfügbar ist
    • Wenn es richtig gemacht, sollten Sie einen ^[ sehen. Obwohl es wie zwei Zeichen aussieht, ist es wirklich nur eine, die ESC Charakter.
    • Sie können auch die Taste STRG + V , STRG + [ in vim in eines der Programmierung oder sripting langauges, weil das verwendet einen wörtlichen ESC Charakter
    • Sie können aber auch ersetzen Strg + [ mit ESC ... zB können Sie STRG + < kbd> V , ESC , aber ich finde die ehemaligen einfacher, da ich bin schon mit STRG und da [ weniger aus die Art und Weise.

ANSI Escape-Sequenzen

Hintergrund auf Escape-Sequenzen

Es ist zwar nicht der beste Weg ist, es zu tun, ist der einfachste Weg, dies in einer Programmier- oder Skriptsprache zu tun ist, zu verwenden, Escape-Sequenzen . Von diesem Link:

  

Eine Escape-Sequenz ist eine Reihe von Zeichen verwendet, um den Zustand von Computern zu ändern und ihren angeschlossenen Peripheriegeräten. Diese werden auch als Kontrollsequenzen bekannt, was ihre Verwendung in der Gerätesteuerung.

Backgound auf ANSI Escape-Sequenzen

Allerdings wird es noch einfacher, als das in dem Videotextterminals, wie diese Anschlüsse verwenden ANSI-Escape Sequenzen . Von diesem Link:

  

ANSI-Escape-Sequenzen sind ein Standard für die In-Band-Signalisierung der Cursor-Position zu steuern, Farbe und andere Optionen auf Videotextterminals. Bestimmte Sequenzen von Bytes, beginnend mit dem meisten und Esc ‚[‘, sind in den Text eingebettet ist, die das Endgerät sucht und interpretiert als Befehl, nicht als Zeichenkodes.

Wie Verwenden von ANSI-Sequenzen

Escape

Allgemein

  • Escape-Sequenzen beginnen mit einem Escape-Zeichen; für ANSI-Escape-Sequenzen, beginnt die Sequenz immer mit ESC (ASCII: 27 / hex: 0x1B).
  • Eine Liste von dem, was Sie tun können, finden Sie in den Escape-ANSI Sequenz-Liste auf Wikipedia

In Programmiersprachen

Einige Programmierlangauges (wie Java) nicht \e oder \x1b als ESC Zeichen interpretieren. Wir wissen jedoch, dass das ASCII-Zeichen 27 ist der ESC Charakter, so können wir einfach Typumwandlung 27 zu einem char und verwenden, die die Escape-Sequenz zu beginnen.

Hier sind einige Möglichkeiten, es in gängigen Programmiersprachen zu tun:

  • Java

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

    • print(chr(27) + "[34mBLUE");
    • print("\x1b[35mMAGENTA");
      • , dass \x1b Hinweis ist interpretted richtig in Python
  • Node JS

    • Im Folgenden wird nicht Farbausgabe in JavaScript in der Webkonsole
    • console.log(String.fromCharCode(27) + "[36mCYAN");
    • console.log("\x1b[30;47mBLACK_ON_WHITE");
      • Beachten Sie, dass \x1b funktioniert auch in node

In Shell-Eingabeaufforderung oder Scripts

Wenn Sie arbeiten, bash oder zsh , ist es ganz einfach, den Ausgang zu färben (in den meisten Terminals). In Linux, OS X, und in einigen Terminals des Fenster, können Sie überprüfen, ob Ihr Terminal Farbe unterstützt durch beide der folgenden Aktionen ausführen:

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

Wenn Sie Farbe für beide sehen, dann ist das großartig! Wenn Sie Farbe zu sehen nur eine, dann diese Sequenz verwenden. Wenn Sie nicht die Farbe für eine von ihnen sehen, dann zu überprüfen, um sicher, dass Sie alles richtig eingegeben haben, und dass Sie in bash oder zsh sind; wenn Sie noch keine Farbe sehen, dann Ihr Terminal wahrscheinlich unterstützt ANSI nicht Escape-Sequenzen.

Wenn ich mich richtig erinnere, Linux-Terminals sind in der Regel beide \e und \x1b Escape-Sequenzen zu unterstützen, während os x Terminals nur neigen \e zu unterstützen, aber ich kann falsch sein. Dennoch, wenn Sie so etwas wie das folgende Bild sehen, dann sind Sie nicht! (Beachten Sie, dass ich die Schale verwenden, zsh , und es ist meine Prompt-String Färbung;. Auch, ich bin mit urxvt als mein Terminal in Linux)

 ANSI Escape-Sequenzen Coloring Text Red

"Wie funktioniert das?" könnte man fragen. Bascially, printf ist interpretting die Folge von Zeichen, die folgen (alles in dem Apostrophe ). Wenn printf \e oder \x1b trifft, wird es diese Zeichen in das ESC Zeichen (: 27 ASCII) konvertieren. Das ist genau das, was wir wollen. Nun sendet printf ESC 31m, und da es eine ist ESC , gefolgt von einer gültigen Escape-Sequenz ANSI, sollten wir farbige Ausgabe erhalten (so lange, wie es durch das Endgerät unterstützt wird ).

Sie können auch echo -e '\e[32mGREEN' verwenden (zum Beispiel), Ausgang zu färben. Beachten Sie, dass die -e Flagge für echo „[ermöglicht] Interpretation von Backslash“ und muss verwendet werden, wenn Sie echo wollen in geeigneter Weise die Escape-Sequenz zu interpretieren.


Mehr zu ANSI Escape-Sequenzen

ANSI-Escape-Sequenzen können mehr tun, als nur die Farbausgabe, aber sie damit anfangen, und genau sehen, wie Farbe Werke; wir werden dann sehen, wie Sie den Cursor zu manipulieren; Schließlich werden wir einen Blick darauf werfen und sehen, wie 8-Bit-Farbe zu verwenden, und auch 24-Bit-Farbe (obwohl es nur dürftige Unterstützung hat).

Wikipedia , beziehen sie sich auf ESC [ als CSI, also werde ich das gleiche tun.

Farbe

Um die Farbausgabe mit ANSI entweicht, verwenden Sie die folgenden Schritte aus:

  • CSI n m
    • CSI: Escape-Zeichen-^[[ oder ESC [
    • n: eine Nummer eins der folgenden Möglichkeiten:
      • 30-37, 39: Vordergrund
      • 40-47, 49: Hintergrund
    • m: eine wörtliche ASCII m-beendet die Escape-Sequenz

Ich werde bash oder zsh to alle möglichen Farbkombinationen zeigen. Plop die folgende in bash oder zsh zu sehen, für sich selbst (Möglicherweise müssen Sie \e mit \x1b ersetzen):

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

Ergebnis:

 verschiedene Vorder- / Hintergrundfarben ANSI entkommt

Quick Reference (Farbe)

+~~~~~~+~~~~~~+~~~~~~~~~~~+
|  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  |
+~~~~~~+~~~~~~+~~~~~~~~~~~+

Grafik auswählen Rendition (SGR)

SGR nur ermöglicht es Ihnen, den Text zu ändern. Viele von ihnen arbeiten nicht in bestimmten Terminals, so dass diese Projekte sparsam in Produktionsebene verwenden. Sie können jedoch für die Herstellung von Programm Ausgabe lesbarer oder helfen Sie, zwischen verschiedenen Arten von Ausgängen zu unterscheiden nützlich sein.

Farbe fällt tatsächlich unter SGR, so dass die Syntax ist das gleiche:

  • CSI n m
    • CSI: Escape-Zeichen-^[[ oder ESC [
    • n: eine Nummer eins der folgenden Möglichkeiten:
      • 0: reset
      • 1-9: schaltet verschiedene Texteffekte
      • 21-29: wendet verschiedene Texteffekte (weniger unterstützt als 1-9)
      • off
      • 30-37, 39: Vordergrundfarbe
      • 40-47, 49: Hintergrundfarbe
      • 38: 8- oder 24-Bit-Vordergrundfarbe (siehe 24.08-Bit-Farbe unten)
      • 48: 8- oder 24-Bit-Hintergrundfarbe (siehe 24.08-Bit-Farbe unten)
    • m: eine wörtliche ASCII m-beendet die Escape-Sequenz

Obwohl nur dürftige Unterstützung für schwache (2) ist, kursiv (3), Unterstrichen (4), Blinken (5,6), Reverse-Video (7), verbergen (8) und ausgestrichen (9), einige (aber selten alle) sind in der Regel auf linux und OS x-Terminals arbeiten.

Es ist auch erwähnenswert, dass Sie eine der oben genannten Attribute mit einem Semikolon trennen können. Zum Beispiel wird printf '\e[34;47;1;3mCRAZY TEXT\n' zeigen CRAZY TEXT mit einem blue foreground auf einem white background, und es wird bold und italic sein.

Beispiel:

 string Attribute zusammen Beispiel Screenshot

Plop die folgenden in Ihrem bash oder zsh Shell alle Texteffekte zu sehen, was Sie tun können. (Möglicherweise müssen Sie \e mit \x1b ersetzen.)

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

Ergebnis:

 SGR Zustand 1 SGR Zustand 2

Sie sehen, dass mein Terminal alle Texteffekte unterstützt außer für schwach (2), verbergen (8) und ausstreichen (9).

Quick Reference (SGR Attribute 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-Bit-Farbe

Während die meisten Terminals dies unterstützt, wird es weniger unterstützt als 0-7, 9 Farben.

Syntax:

  • CSI 38;5; n m
    • CSI: Escape-Zeichen-^[[ oder ESC [
    • 38;5;: Zeichenkette, die Verwendung von 8-Bit-Farben für Vordergrund
    • bezeichnet
    • n: eine Nummer eins der folgenden Möglichkeiten:
      • 0-255

Wenn Sie previe wollenw alle Farben in Ihrem Terminal auf eine nette Art, ich habe ein schönes Skript auf gist.github.com .

Es sieht wie folgt aus:

 8-Bit-Farb Beispiel Screenshot

Wenn Sie den Hintergrund mit 8-Bit-Farben ändern möchten, ersetzen Sie einfach den 38 mit einem 48:

  • CSI 48;5; n m
    • CSI: Escape-Zeichen-^[[ oder ESC [
    • 48;5;: Zeichenkette, die Verwendung von 8-Bit-Farben für Hintergrund
    • bezeichnet
    • n: eine Nummer eins der folgenden Möglichkeiten:
      • 0-255

24-Bit-Farbe

Auch bekannt als wahre Farbe, 24-Bit-Farbe ein paar wirklich coole Funktionalität zur Verfügung stellt. Unterstützung für diese wächst definitiv (soweit ich es in den meisten modernen Terminals mit Ausnahme von urxvt , mein Terminal [insert wütend Emoji] wissen arbeitet).

24-Bit-Farbe ist eigentlich in vim unterstützt (siehe vim wiki , um zu sehen, wie man ermöglichen 24-Bit-Farben). Es ist wirklich nett, weil es aus dem Farbschema für gvim definiert zieht; zB verwendet er die fg / bg aus highlight guibg=#______ guifg=#______ für die 24-Bit-Farben! Neato, nicht wahr?

Hier ist, wie 24-Bit-Farbe funktioniert:

  • CSI 38;2; r ; g ; b m
    • CSI: Escape-Zeichen-^[[ oder ESC [
    • 38;2;: Zeichenkette, die Verwendung von 24-Bit-Farben für Vordergrund
    • bezeichnet
    • r, g, b: Zahlen-each sollte sein 0-255

Um zu testen, nur ein paar der vielen Farben, die Sie haben können ((2^8)^3 oder 2^24 oder 16777216 possibilites, glaube ich), können Sie dies in bash oder zsh verwenden:

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

Ergebnis (dies ist in gnome-terminal da urxvt unterstützt nicht 24-Bit-Farbe ..., das es zusammen, urxvt Maintainer ... für real):

 24-Bit-Farb Beispiel Screenshot

Wenn Sie für den Hintergrund 24-Bit-Farben wollen ... Sie ahnen es! Sie ersetzen nur 38 mit 48:

  • CSI 48;2; r ; g ; b m
    • CSI: Escape-Zeichen-^[[ oder ESC [
    • 48;2;: Zeichenkette, die Verwendung von 24-Bit-Farben für Hintergrund
    • bezeichnet
    • r, g, b: Zahlen-each sollte sein 0-255

Einfügen von Raw Escape-Sequenzen

Manchmal \e und \x1b wird nicht funktionieren. Zum Beispiel in der sh Shell, manchmal weder Werke (obwohl es tut auf meinem System Jetzt , ich glaube nicht, es verwendet).

Um dies zu umgehen, können Sie STRG + V , STRG + [ oder CTRL V , ESC

Dies wird legen Sie ein "rohen" ESC Zeichen (ASCII: 27). Es wird so aussehen ^[, aber keine Sorge; es ist nur ein Zeichen, nicht zwei.

Beispiel:

 sh roh Escape char Beispiel Screenshot


Flüche

Siehe Flüche (Programming Library) für eine vollständige Referenz auf Flüche. Es sollte beachtet werden, dass nur Flüche arbeitet auf Unix und Unix-ähnlichen Betriebssystemen.

und Ausführen mit Flüchen

Ich will nicht zu sehr ins Detail gehen, für Suchmaschinen Links zu Websites offenbaren kann, dass ich viel besser, als man erklären kann, aber ich werde es diskutieren hier kurz und ein Beispiel geben.

Warum verwenden Flüche über ANSI Escapes?

Wenn Sie den obigen Text lesen, könnten Sie, dass \e erinnern oder \x1b wird manchmal mit printf arbeiten. Nun, manchmal \e und \x1b wird überhaupt nicht funktionieren (dies ist nicht Standard ist, und ich habe noch nie mit einem Terminal, wie dies funktioniert, aber es ist möglich). Noch wichtiger ist, komplexere Escape-Sequenzen (man denke Home und andere Multi-Zeichentasten) sind schwierig für jedes Endgerät zu unterstützen (es sei denn, Sie bereit sind, viel Zeit und Mühe aufwenden, term und termcap Parsen und und herauszufinden, wie jedes Endgerät zu handhaben).

Flüche löst dieses Problem. Im Grunde ist es in der Lage, zu verstehen, welche Fähigkeiten ein Endgerät hat, mit diesen Methoden (wie von dem Wikipedia-Artikel beschrieben verknüpfen oben):

  

Die meisten Implementierungen von Flüchen verwenden, um eine Datenbank, die die Fähigkeiten von Tausenden von verschiedenen Terminals beschreiben kann. Es gibt ein paar Implementierungen, wie PDCurses, die eher spezielle Gerätetreiber verwenden als eine Terminal-Datenbank. Die meisten Implementierungen verwenden term; einige Verwendung termcap. Flüche haben den Vorteil, Back-Portabilität Charakter-Zell-Terminals und Einfachheit. Für eine Anwendung, die eine Schnittstelle Implementierung Flüche verwendet, wird in der Regel viel einfacher und schneller, als man mit einem X-Toolkit nicht Bitmap-Grafiken oder mehrere Schriftarten erfordern.

Die meiste Zeit wird Flüche abfragen und term wird dann in der Lage sein zu verstehen, wie Sie den Cursor zu manipulieren und Textattribute. Dann Sie, der Programmierer, verwenden Sie die von Flüche bereitgestellt API den Cursor oder ändern Sie die Textfarbe oder andere Attribute zu manipulieren, wenn die Funktionalität, die Sie suchen, gewünscht wird.

Beispiel mit Python

Ich finde Python wirklich einfach zu bedienen ist, aber wenn man Flüche in einer anderen Programmiersprache verwenden möchten, dann einfach auf DuckDuckGo suchen oder jede andere Suchmaschine. :) Hier ist ein kurzes Beispiel in 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)

Ergebnis:

 image description hier

Man könnte sich denken, dass dies ein viel Umwegen, Dinge zu tun, aber es ist wirklich viel mehr Cross-Plattform (wirklich Cross-Terminal ... zumindest in der Unix- und Unix-ähnlichen Plattformen Welt ). Für Farben, es ist nicht ganz als wichtig, aber wenn es darum geht, andere Multi-Sequenz-Escape-Sequenzen (wie Home zu unterstützen, Ende , Page Up , Seite nach unten , usw.), dann verflucht wird umso wichtiger.

Beispiel mit tput

  • tput ist ein Befehlszeilenprogramm zum Manipulieren von Text-Cursor und
  • tput kommt mit dem curses Paket. Wenn Sie Cross-Terminal (ish) -Anwendungen im Terminal verwenden möchten, sollten Sie verwenden tput, wie es term oder was auch immer parst braucht es und verwendet eine Reihe von standardisierten Befehle (wie Flüche) und gibt die richtige Escape-Sequenz.
  • Beispiel:
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\!"

Ergebnis:

Mehr Infos auf tput

Das hat für mich gearbeitet:

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

Sie müssen die Endung „[37m“ die Farbe weiß zurückzukehren (oder was auch immer Sie verwendet). Wenn Sie nicht können alles machen, die „rot“.

folgen

Sie können die Jansi Bibliothek in ANSI-Escape-Sequenzen in Windows zu machen.

Ja, es ist zu 100% möglich

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

Versuchen Sie diesen Code unten:

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

Hier ist eine Lösung für Win32-Konsole.

1) Holen Sie JavaNativeAccess Bibliotheken hier: https://github.com/twall/jna/

2) Diese beiden Java-Klassen wird es tun.

Genießen.

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

Ich habe eine jar Bibliothek namens JCDP ( Java Farbige Debug Drucker ).

Für Linux verwendet sie den ANSI-Escape-Codes, den Whitefang erwähnt, aber abstrahiert sie Worte anstelle von Codes mit denen viel intuitiver ist.

Für Windows enthält es tatsächlich die Jansi Bibliothek, sondern schafft eine Abstraktionsschicht über sie, die intuitive und einfache Schnittstelle für Linux erstellt beibehalten wird.

Diese Bibliothek ist lizenziert unter der MIT-Lizenz so fühlen sich frei, es zu benutzen.

Hier finden Sie aktuelle JCDP der Github-Repository .

Die einfachste Methode ist das Programm (nicht modifiziert) in Cygwin Konsole ausgeführt werden.

Die zweite einfachste Methode ist, dass Sie Programm (auch nicht modifiziert) im normalen Windows-Konsole, Pipelining seinen Ausgang durch tee.exe (von Cygwin oder Git-Verteilung) laufen. Tee.exe werden die Escape-Codes erkennen und entsprechende WinAPI Funktionen aufrufen.

So etwas wie:

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

Escape-Sequenzen muss durch etwas interpretiert werden umgewandelt Farbe werden. Die Standard-CMD.EXE von Java verwendet, wenn von der Kommandozeile gestartet wird, unterstützt diese Funktion nicht so daher Java nicht.

Check this out: i verwenden ANSI-Werte mit Escape-Code und es funktioniert wahrscheinlich nicht in Windows-Eingabeaufforderung aber in IDEs und Unix-Shell. Sie können auch Bibliothek 'Jansi' überprüfen hier für Windows.

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

System.err.println ( "Errorrrrrr") es sich um Text in roter Farbe auf der Konsole gedruckt wird.

Ich habe eine Bibliothek mit dem Namen geschrieben AnsiScape , die Sie farbige Ausgabe in einer strukturierteren schreiben können Art und Weise:

Beispiel:

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

Die Bibliothek erlaubt es Ihnen auch Ihre eigenen „escape Klassen“ verwandt CSS-Klassen zu definieren.

Beispiel:

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

Dies funktioniert nur in Eclipse drehen rot, weiß nicht, über andere Orte.

System.err.println(" BLABLA ");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top