web-dev-qa-db-ja.com

System.out.printlnの出力を色付けする方法は?

Java出力に色を付けるにはどうすればよいですか?

たとえば、Cおよび他の言語では、\033[0mなどのANSIエスケープを使用してこれを行うことができます。しかし、Javaでは機能しません。

public static void main(String[] x) {
    System.out.println("\033[0m BLABLA \033[0m\n");
}
117
Davide Aversa

いいえ、しかしそれを処理できるサードパーティのAPIがあります

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

編集:もちろん、私が投稿したものよりも新しい記事がありますが、情報はまだ実行可能です。

26
Jonas B

注意

Windowのcmd Promptに色を付けることはできないかもしれませんが、多くのUNIX(またはUnixに似た)端末で動作するはずです。

また、一部の端末は、一部のANSIエスケープシーケンス、特に24ビットカラーをサポートしていないことに注意してください。

使用法

最良の解決策については、下部のCursesセクションを参照してください。個人的または簡単なソリューション(クロスプラットフォームソリューションとしてnot)については、ANSI Escape Sequencesセクションを参照してください。


TL; DR

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

  • pythonprint(chr(27) + "[31m" + "ERROR MESSAGE IN RED")

  • bashまたはzshprintf '\x1b[31mERROR MESSAGE IN RED'
    • これはOs Xでも機能する可能性があります:printf '\e[31mERROR MESSAGE IN RED'
  • shprintf 'CTRL+VCTRL+[[31mERROR MESSAGE IN RED'
    • つまり、 CTRL + V を押してから CTRL + [を押して「raw」を取得します ESC エスケープ解釈が利用できない場合の文字
    • 正しく行われると、^[が表示されます。 2文字のように見えますが、実際には1つだけです。 ESC キャラクター。
    • を押すこともできます CTRL+VCTRL+[ in vimプログラミングまたはスライピング言語では、リテラルを使用するため ESC キャラクター
    • また、交換することができます Ctrl+[ と ESC …たとえば、次のように使用できます CTRL+VESC、しかし、前者の方が簡単だと思う CTRL それ以来 [ 邪魔にならない。

ANSIエスケープシーケンス

エスケープシーケンスの背景

最適な方法ではありませんが、プログラミングまたはスクリプト言語でこれを行う最も簡単な方法は、エスケープシーケンスを使用することです。そのリンクから:

エスケープシーケンスは、コンピューターとその周辺機器の状態を変更するために使用される一連の文字です。これらは制御シーケンスとも呼ばれ、デバイス制御での使用を反映しています。

ANSIエスケープシーケンスの背景

ただし、これらの端末はANSIエスケープシーケンスを使用するため、ビデオテキスト端末よりもさらに簡単になります。そのリンクから:

ANSIエスケープシーケンスは、ビデオテキスト端末のカーソル位置、色、およびその他のオプションを制御するためのインバンドシグナリングの標準です。ほとんどがEscおよび「[」で始まる特定のバイトシーケンスはテキストに埋め込まれ、端末は文字コードではなくコマンドとして検索および解釈します。

ANSIエスケープシーケンスの使用方法

一般的に

  • エスケープシーケンスはエスケープ文字で始まります。 ANSIエスケープシーケンスの場合、シーケンスは常に次で始まります ESC (ASCII:27/hex:0x1B)。
  • できることのリストについては、 WikipediaのANSIエスケープシーケンスリスト を参照してください。

プログラミング言語で

一部のプログラミング言語(Javaなど)は、\eまたは\x1bを ESC キャラクター。ただし、ASCII文字27is ESC したがって、27charに型キャストし、それを使用してエスケープシーケンスを開始できます。

一般的なプログラミング言語でそれを行ういくつかの方法を次に示します。

  • Java

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

    • print(chr(27) + "[34mBLUE");
    • print("\x1b[35mMAGENTA");
      • \x1bはPythonで正しく解釈されることに注意してください
  • ノードJS

    • 以下はNOT WebコンソールのJavaScriptでのカラー出力
    • console.log(String.fromCharCode(27) + "[36mCYAN");
    • console.log("\x1b[30;47mBLACK_ON_WHITE");
      • \x1bはノードでも機能することに注意してください

シェルプロンプトORスクリプト

bash または zsh を使用している場合、出力の色付けは非常に簡単です(ほとんどの端末で)。 Linux、Os X、および一部のWindowの端末では、次の両方を実行して、端末が色をサポートしているかどうかを確認できます。

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

両方の色が表示される場合、それは素晴らしいことです! 1つだけの色が表示される場合は、そのシーケンスを使用します。どちらにも色が表示されない場合は、すべてを正しく入力したことと、bashまたはzshを使用していることを確認してください。それでも色が表示されない場合、お使いの端末はおそらくANSIエスケープシーケンスをサポートしていません。

正しく思い出せば、Linux端末は\e\x1bの両方のエスケープシーケンスをサポートする傾向がありますが、os x端末は\eのみをサポートする傾向がありますが、間違っている可能性があります。それでも、次の画像のようなものが表示されていれば、設定は完了です! (シェル zsh を使用しており、プロンプト文字列を着色している​​ことに注意してください。また、 urxvt を端末として使用しています。 Linuxで。)

ANSI Escape Sequences Coloring Text Red

「これはどのように機能しますか?」基本的に、printfは後続の文字シーケンス(単一引用符内のすべて)を解釈しています。 printf\eまたは\x1bに遭遇すると、これらの文字を ESC 文字(ASCII:27)。それがまさに私たちが望むものです。現在、printfは ESC31m、および ESC 有効なANSIエスケープシーケンスが続くと、色付きの出力が得られます(端末でサポートされている場合)。

echo -e '\e[32mGREEN'(たとえば)を使用して、出力に色を付けることもできます。 echo-eフラグ "[バックスラッシュエスケープの解釈を有効にする]" を使用し、echoでエスケープシーケンスを適切に解釈する場合に使用する必要があります。


ANSIエスケープシーケンスの詳細

ANSIエスケープシーケンスは単なるカラー出力ではありませんが、それから始めて、カラーがどのように機能するかを正確に見てみましょう。次に、カーソルの操作方法を確認します。最後に、8ビットカラーと24ビットカラーの使用方法を確認します(ただし、サポートはごくわずかです)。

Wikipedia では、彼らは ESC[ CSIのように、同じことをします。

ANSIエスケープを使用して出力に色を付けるには、次を使用します。

  • CSInm
    • CSI:エスケープ文字-^[[または ESC[
    • n:数値-次のいずれか:
      • 30-3739:前景
      • 40-4749:バックグラウンド
    • m:リテラルASCII m-エスケープシーケンスを終了します

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に該当するため、構文は同じです。

  • CSInm
    • CSI:エスケープ文字-^[[または ESC[
    • n:数値-次のいずれか:
      • 0:リセット
      • 1-9:さまざまなテキスト効果をオンにします
      • 21-29:さまざまなテキスト効果をオフにします(1-9よりもサポートが少ない)
      • 30-3739:前景色
      • 40-4749:背景色
      • 38:8ビットまたは24ビットの前景色(下記の8/24ビット色を参照)
      • 48:8ビットまたは24ビットの背景色(下記の8/24ビット色を参照)
    • m:リテラルASCII m-エスケープシーケンスを終了します

かすかな(2)、斜体(3)、下線(4)、点滅(5、6)、反転表示(7)、隠蔽(8)、および取り消し線(9)のサポートはごくわずかです(ただし、まれにすべて)Linuxおよびos x端末で動作する傾向があります。

また、上記の属性をセミコロンで区切ることができることに注意する価値があります。たとえば、printf '\e[34;47;1;3mCRAZY TEXT\n'CRAZY TEXTblue foregroundが付いたwhite backgroundを表示し、boldおよびitalicになります。

例えば:

string attributes together example screenshot

Bashシェルまたはzshシェルに以下を追加して、実行できるすべてのテキスト効果を確認します。 (\e\x1bに置き換える必要がある場合があります。)

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

結果:

SGR state 1SGR state 2

私の端末はすべてのテキスト効果をサポートしていることがわかりますexcept for faint (2)、 conceal ( 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-79色よりもサポートされていません。

構文:

  • CSI38;5;nm
    • CSI:エスケープ文字-^[[または ESC[
    • 38;5;:前景に8ビット色を使用することを示すリテラル文字列
    • n:数値-次のいずれか:
      • 0-255

端末内のすべての色を素敵な方法でプレビューしたい場合、 Gist.github.comの素敵なスクリプト があります。

次のようになります。

8-bit color example screenshot

8ビット色を使用して背景を変更する場合は、3848に置き換えるだけです。

  • CSI48;5;nm
    • CSI:エスケープ文字-^[[または ESC[
    • 48;5;:背景に8ビット色を使用することを示すリテラル文字列
    • n:数値-次のいずれか:
      • 0-255

24ビットカラー

トゥルーカラーとしても知られる24ビットカラーは、非常に優れた機能を提供します。これに対するサポートは間違いなく成長しています( urxvt 、私の端末[怒っている絵文字を挿入]を除くほとんどの最新端末で動作することを知っている限り)。

実際、vimでは24ビットカラーがサポートされています(24ビットカラーを有効にする方法については、 vim wiki を参照してください)。 gvim用に定義されたカラースキームから取得するため、本当にすてきです。たとえば、24ビット色に対してhighlight guibg=#______ guifg=#______のfg/bgを使用します!ネイト?

24ビットカラーの仕組みは次のとおりです。

  • CSI38;2;r;g;bm
    • CSI:エスケープ文字-^[[または ESC[
    • 38;2;:前景に24ビット色の使用を示すリテラル文字列
    • rgb:数値—それぞれは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ビットカラーをサポートしていません ... getそれを一緒に、urxvtメンテナー...本当の場合):

24-bit color example screenshot

背景に24ビットカラーが必要な場合は、推測したでしょう! 3848に置き換えるだけです:

  • CSI48;2;r;g;bm
    • CSI:エスケープ文字-^[[または ESC[
    • 48;2;:背景に24ビット色の使用を示すリテラル文字列
    • rgb:数値—それぞれは0-255でなければなりません

生のエスケープシーケンスの挿入

\eおよび\x1bが機能しない場合があります。たとえば、 sh シェルでは、どちらも機能しない場合があります(私のシステムではnowですが、以前はそう思わなかった)。

これを回避するには、次を使用できます。 CTRL+VCTRL+[ または CTRLVESC

これは「生」を挿入します ESC 文字(ASCII:27)。この^[のように見えますが、心配しないでください。 2文字ではなく、1文字です。

例えば:

sh raw escape char example screenshot


呪い

Cursesの完全なリファレンスについては、 Curses(プログラミングライブラリ)ページ を参照してください。 cursesは、unixおよびunixライクなオペレーティングシステムでのみ機能することに注意してください。

Cursesを使用して実行する

検索エンジンはこれを説明できるWebサイトへのリンクを明らかにすることができるので、あまり詳しく説明しませんが、ここで簡単に説明し、例を示します。

ANSIエスケープでCursesを使用する理由

上記のテキストを読むと、\eまたは\x1bprintfで動作する場合があることを思い出してください。まあ、時には\e\x1bがまったく動作しないことがあります(これは標準ではなく、このような端末で作業したことはありませんが、可能です)。さらに重要なことは、より複雑なエスケープシーケンス(考えてみてください Home (他の複数文字キー)は、すべての端末でサポートすることは困難です(terminfoとtermcapを解析し、すべての端末を処理する方法を理解することに多くの時間と労力を費やすつもりがない限り)。

Cursesはこの問題を解決します。基本的に、これらのメソッドを使用して、端末の機能を理解することができます(上記のウィキペディアの記事で説明されています)。

Cursesのほとんどの実装は、数千の異なる端末の機能を記述できるデータベースを使用します。 PDCursesなど、端末データベースではなく特殊なデバイスドライバーを使用する実装がいくつかあります。ほとんどの実装はterminfoを使用します。いくつかはtermcapを使用します。 Cursesには、文字セル端末へのバックポータビリティとシンプルさという利点があります。ビットマップグラフィックスまたは複数のフォントを必要としないアプリケーションの場合、通常、cursesを使用したインターフェースの実装は、Xツールキットを使用したものよりもはるかに単純で高速です。

ほとんどの場合、cursesはterminfoをポーリングし、カーソルとテキスト属性を操作する方法を理解できるようになります。次に、プログラマーであるあなたは、cursesが提供するAPIを使用して、目的の機能が必要な場合にカーソルを操作したり、テキストの色やその他の属性を変更します。

Pythonの例

pythonは本当に使いやすいと思いますが、別のプログラミング言語でcursesを使用する場合は、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 __== '__main__':
    curses.wrapper(main)

結果:

enter image description here

あなたはこれがもっと物事を行うためのラウンドアラウンドな方法であると思うかもしれませんが、それは実際にははるかにクロスプラットフォームです(少なくともクロスターミナル…少なくともユニックスとユニックスライクプラットフォームの世界では)。色については、 quite ほど重要ではありませんが、他のマルチシーケンスエスケープシーケンスのサポートに関しては( Home、 End、 Page Up、 Page Downなど)、その後、呪いがより重要になります。

Tputを使用した例

  • tputは、カーソルとテキストを操作するためのコマンドラインユーティリティです
  • tputにはcursesパッケージが付属しています。端末でクロスターミナル(ish)アプリケーションを使用する場合は、terminfoまたは必要なものを解析し、標準化されたコマンド(cursesなど)を使用して正しいエスケープシーケンスを返すため、tputを使用する必要があります。
  • 例:
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の詳細

105
dylnmc

これは私のために働いています:

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

色を白(または使用していたもの)に戻すには、末尾に「[37m」が必要です。そうしないと、「赤」に続くものすべてが作成される可能性があります。

32
DanP

JANSI ライブラリを使用して、WindowsでANSIエスケープシーケンスをレンダリングできます。

11
MrDrews

はい、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();
  }
}
10
Raman

Win32コンソールのソリューションを次に示します。

1)ここでJavaNativeAccessライブラリを取得します: https://github.com/twall/jna/

2)これらの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();
        }
    }
}
5
kevinarpe

JCDPJava Colored Debug Printer)というjarライブラリを作成しました。

Linuxの場合、WhiteFangが言及したANSIエスケープコードを使用しますが、より直感的なコードの代わりに単語を使用してそれらを抽象化します。

Windowsの場合、実際にはJAnsiライブラリが含まれていますが、その上に抽象化レイヤーを作成し、Linux用に作成された直感的でシンプルなインターフェースを維持します。

このライブラリは MIT License でライセンスされているので、自由に使用してください。

JCDPのgithubリポジトリ をご覧ください。

4
dialex

最も簡単な方法は、Cygwinコンソールでプログラム(変更なし)を実行することです。

2番目の最も簡単な方法は、通常のWindowsコンソールでプログラム(変更なし)を実行し、tee.exe(CygwinまたはGitディストリビューションから)を介して出力をパイプライン処理することです。 Tee.exeはエスケープコードを認識し、適切なWinAPI関数を呼び出します。

何かのようなもの:

Java MyClass | tee.exe log.txt
Java MyClass | tee.exe /dev/null
3
user222202

エスケープシーケンスは、SOMETHINGが色に変換するために解釈する必要があります。コマンドラインから起動したときにJavaが使用する標準のCMD.EXEはこれをサポートしないため、Javaはサポートしません。

チェックアウト:エスケープコードでANSI値を使用しましたが、Windowsコマンドプロンプトでは動作しませんが、IDEおよびUnixシェルでは動作しません。 'Jansi'ライブラリをチェックすることもできます here Windowsサポートについて.

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

System.err.println( "Errorrrrrr")は、コンソールにテキストを赤色で印刷します。

0
Kamran

AnsiScape というライブラリを作成しました。これにより、より構造化された方法でカラー出力を作成できます。

例:

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

また、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));
0
Andrei Ciobanu