java - 如何为System.out.println输出颜色?

这个问题在这里已有答案:

  • 如何使用System.out.println在控制台中打印颜色?                                     9个答案

如何为Java输出着色?

例如在C和其他语言中,我可以使用ANSI-escape,如\033[0m来执行此操作。 但在Java中它并不起作用。

public static void main(String[] x) {
    System.out.println("\033[0m BLABLA \033[0m\n");
}
Davide Aversa asked 2019-06-28T13:05:43Z
13个解决方案
99 votes

注意

您可能无法为Window的cmd prompt着色,但它应该可以在许多unix(或unix-like)终端中使用。

另外,请注意,某些终端只是不支持某些(如果有的话)ANSI转义序列,特别是24位颜色。

用法

请参阅底部的Curses部分以获得最佳解决方案。 对于个人或简单的解决方案(尽管不是跨平台解决方案),请参阅ANSI Escape Sequences部分。


TL; DR

  • java:CSI

  • python:CSI

  • bash或zsh:CSI
    • 这也适用于Os X:CSI
  • sh:CSICTRL + V,CTRL + [48;5;
    • 即按CTRL + V然后按CTRL + [以获得" raw" 当转义解释不可用时,ESC字符
    • 如果操作正确,你应该看到一个CSI.虽然它看起来像两个字符,但它实际上只是一个ESC字符。
    • 你也可以按CTRL + V,CTRL + [在vim中的任何编程或者sripting语言,因为它使用文字ESC字符
    • 此外,你可以用ESC替换Ctrl + [例如,你可以使用CTRL + V,ESC,但我发现前者更容易,因为我已经按下了CTRL,因为[不太偏僻。

ANSI转义序列

逃逸序列的背景

虽然这不是最好的方法,但在编程或脚本语言中执行此操作的最简单方法是使用转义序列。 从该链接:

转义序列是用于更改计算机及其连接的外围设备状态的一系列字符。 这些也称为控制序列,反映了它们在设备控制中的使用。

ANSI转义序列的背景知识

然而,它比视频文本终端更容易,因为这些终端使用ANSI转义序列。 从该链接:

ANSI转义序列是带内信令的标准,用于控制视频文本终端上的光标位置,颜色和其他选项。 某些字节序列(大部分以Esc和' ['开头]嵌入到文本中,终端查找并解释为命令,而不是字符代码。

如何使用ANSI转义序列

通常

  • 转义序列以转义字符开头; 对于ANSI转义序列,序列始终以ESC开头(ASCII:CSI / hex:48;5;)。
  • 有关您可以执行的操作的列表,请参阅Wikipedia上的ANSI转义序列列表

在编程语言中

一些编程语言(如Java)不会将CSI48;5;解释为ESC字符。 但是,我们知道ASCII字符n是ESC字符,因此我们可以简单地将m类型转换为bold并使用它来开始转义序列。

以下是一些使用通用编程语言的方法:

  • Java的

    • CSI
  • Python 3

    • CSI
    • CSI
      • Note that CSI is interpretted correctly in python
  • 节点JS

    • 以下内容不会在Web控制台的JavaScript中输出颜色
    • CSI
    • CSI
      • 请注意,CSI也适用于节点

在Shell提示符或脚本中

如果您正在使用bash或zsh,则很容易为输出着色(在大多数终端中)。 在Linux,Os X和某些Window终端中,您可以通过执行以下两项操作来检查终端是否支持颜色:

  • CSI
  • CSI

如果你看到两者的颜色,那就太棒了! 如果只看到一个颜色,则使用该序列。 如果你没有看到其中任何一个的颜色,那么仔细检查以确保你正确输入所有内容并且你是bash或zsh; 如果您仍然看不到任何颜色,那么您的终端可能不支持ANSI转义序列。

如果我没记错的话,linux终端倾向于同时支持CSI48;5;转义序列,而os x终端只倾向于支持n,但我可能错了。 尽管如此,如果您看到类似下图的内容,那么您就完全了! (注意我正在使用shell,zsh,它正在着色我的提示字符串;另外,我使用urxvt作为我在linux中的终端。)

ANSI Escape Sequences Coloring Text Red

"这是如何工作的?" 你可能会问。 基本上,CSI正在解释后面的字符序列(单引号内的所有内容)。 当48;5;遇到nm时,它会将这些字符转换为ESC字符(ASCII:27)。 这正是我们想要的。 现在,bold发送ESCitalic,并且由于ESC后面跟着一个有效的ANSI转义序列,我们应该得到彩色输出(只要终端支持它)。

您也可以使用CSI(例如)来颜色输出。 请注意48;5;标志n" [启用]解释反斜杠转义" 如果您希望m正确解释转义序列,则必须使用。


有关ANSI转义序列的更多信息

ANSI转义序列可以做的不仅仅是颜色输出,但让我们从那开始,看看颜色是如何工作的; 然后,我们将看到如何操纵光标; 最后,我们来看看如何使用8位颜色和24位颜色(虽然它只有微弱的支持)。

在维基百科上,他们引用ESC [CSI,所以我也会这样做。

颜色

要使用ANSI转义颜色输出,请使用以下命令:

  • CSI 48;5; n
    • CSI:转义字符-48;5;或ESC [
    • CSI:以下数字之一:
      • CSI-48;5;,n:前景
      • CSI-48;5;,n:背景
    • CSI:文字ASCII 48;5; - 终止转义序列

我将使用bash或zsh来演示所有可能的颜色组合。 在bash或zsh中将以下内容自行查看(您可能需要将CSI替换为48;5;):

  • CSI

结果:

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 48;5; n
    • CSI:转义字符-48;5;或ESC [
    • CSI:以下数字之一:
      • CSI:重置
      • CSI-48;5;:打开各种文本效果
      • CSI-48;5;:关闭各种文本效果(支持少于n-m
      • CSI-48;5;,n:前景色
      • CSI-48;5;,n:背景色
      • CSI:8位或24位前景色(见下面的8/24位颜色)
      • CSI:8位或24位背景色(见下面的8/24位颜色)
    • CSI:文字ASCII 48;5; - 终止转义序列

虽然只有微弱的支持(2),斜体(3),下划线(4),闪烁(5,6),反向视频(7),隐藏(8)和划掉(9),但有些(但是 很少全部)倾向于在linux和os x终端上工作。

值得注意的是,您可以使用分号分隔上述任何属性。 例如,CSI将在m上显示48;5;n,并且它将是bolditalic

例如:

string attributes together example screenshot

在bash或zsh shell中添加以下内容以查看您可以执行的所有文本效果。 (您可能需要将CSI替换为48;5;。)

  • CSI

结果:

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位颜色

虽然大多数终端都支持此功能,但它的支持程度低于CSI,48;5;

句法:

  • CSI 48;5; n m
    • CSI:转义字符-48;5;或ESC [
    • CSI:表示使用8位颜色作为前景的文字字符串
    • CSI:以下数字之一:
      • CSI-48;5;

如果你想以一种很好的方式预览终端中的所有颜色,我在gist.github.com上有一个很好的脚本。

它看起来像这样:

8-bit color example screenshot

如果要使用8位颜色更改背景,只需将CSI替换为48;5;

  • CSI 48;5; n m
    • CSI:转义字符-tput或ESC [
    • tput:表示使用8位颜色作为背景的文字字符串
    • tput:以下数字之一:
      • tput-curses

24位颜色

也称为真彩色,24位色彩提供了一些非常酷的功能。 对此的支持肯定在增长(据我所知,除了urxvt,我的终端[插入愤怒的表情符号],它在大多数现代终端都有效)。

vim实际上支持24位颜色(请参阅vim wiki以了解如何启用24位颜色)。 它非常整洁,因为它来自为gvim定义的colorscheme; 例如,它使用tput的fg / bg作为24位颜色! Neato,是吗?

以下是24位颜色的工作原理:

  • tput curses printf \e \x1b ; b m
    • tput:转义字符-curses或ESC [
    • tput:表示使用24位颜色作为前景的文字字符串
    • tput,curses,printf:数字 - 每个应该是\e-\x1b

为了测试你可以拥有的许多颜色中的一些(tputcursesprintf可能,我认为),你可以在bash或zsh中使用它:

  • tput

结果(这是在gnome-terminal,因为urxvt不支持24位颜色......把它放在一起,urxvt维护者......真实的):

24-bit color example screenshot

如果你想要24位颜色的背景......你猜对了! 您只需将tput替换为curses

  • tput curses printf \e \x1b ; b m
    • tput:转义字符-curses或ESC [
    • tput:表示使用24位颜色作为背景的文字字符串
    • tput,curses,printf:数字 - 每个应该是\e-\x1b

插入原始转义序列

有时tputcurses将无法正常工作。 例如,在sh shell中,有时候它们都不起作用(虽然它现在在我的系统上,但我认为它不常用)。

为避免这种情况,您可以使用CTRL + V,CTRL + [或CTRLV,ESC

这将插入" raw" ESC字符(ASCII:27)。 它看起来像这样tput,但不要担心; 它只有一个字符而不是两个字符。

例如:

sh raw escape char example screenshot


诅咒

有关curses的完整参考,请参阅Curses(编程库)页面。 应该注意的是,curses仅适用于unix和类Unix操作系统。

启动并运行Curses

我不会进入太多细节,因为搜索引擎可以显示可以解释这一点的网站链接,但我会在这里简单讨论并举例说明。

为什么使用Curses而不是ANSI Escapes?

如果你阅读上面的文字,你可能还记得tputcurses有时可以使用printf.好吧,有时\e\x1b根本不起作用(这不是标准的,我从来没有使用这样的终端,但它是 可能)。 更重要的是,更复杂的转义序列(想想Home和其他多字符键)很难为每个终端提供支持(除非您愿意花费大量时间和精力解析terminfo和termcap并找出如何处理每个终端)。

诅咒解决了这个问题。 基本上,它能够使用这些方法了解终端具有哪些功能(如上面链接的维基百科文章所述):

大多数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 __name__ == '__main__':
    curses.wrapper(main)

结果:

enter image description here

您可能会认为这是一种更为全面的处理方式,但它实际上是跨平台的(实际上是跨终端的...至少在unix和unix-like-platform世界中)。 对于颜色,它并不那么重要,但是当支持其他多序列转义序列(例如Home,End,Page Up,Page Down等)时,curses就变得更加重要了。

Tput的示例

  • tput是一个用于操作游标和文本的命令行实用程序
  • tput附带curses包。 如果要在终端中使用跨终端(ish)应用程序,则应使用tput,因为它解析terminfo或其所需的任何内容并使用一组标准化命令(如curses)并返回正确的转义序列。
  • 例:
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的更多信息

  • 请参阅:[http://linuxcommand.org/lc3_adv_tput.php]了解tput的工作原理
  • 请参阅:[http://invisible-island.net/ncurses/man/terminfo.5.html]获取可以使用的命令列表
dylnmc answered 2019-06-28T13:23:15Z
31 votes

这对我有用:

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

你需要结束" [37m" 将颜色恢复为白色(或您使用的任何颜色)。 如果你不这样做,它可能会使所有内容跟随"红色"。

DanP answered 2019-06-28T13:23:50Z
26 votes

不,但有第三方API可以处理它

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

编辑:当然有比我发布的文章更新的文章,但信息仍然可行。

Jonas B answered 2019-06-28T13:06:11Z
11 votes

您可以使用JANSI库在Windows中呈现ANSI转义序列。

MrDrews answered 2019-06-28T13:24:21Z
10 votes

是的,它是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();
  }
}
Raman answered 2019-06-28T13:25:05Z
5 votes

这是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();
        }
    }
}
kevinarpe answered 2019-06-28T13:25:52Z
4 votes

我创建了一个名为JCDP(Java彩色调试打印机)的jar库。

对于Linux,它使用WhiteFang提到的ANSI转义码,但是使用单词而不是代码对它们进行抽象,这更加直观。

对于Windows,它实际上包含JAnsi库,但在其上创建了一个抽象层,维护了为Linux创建的直观和简单的界面。

该库根据MIT许可证授权,因此可以随意使用它。

看看JCDP的github存储库。

dialex answered 2019-06-28T13:26:40Z
3 votes

最简单的方法是在Cygwin控制台中运行程序(未修改)。

第二种最简单的方法是在普通的Windows控制台中运行程序(也是未修改的),通过tee.exe(来自Cygwin或Git发行版)管道输出。 Tee.exe将识别转义码并调用适当的WinAPI函数。

就像是:

java MyClass | tee.exe log.txt
java MyClass | tee.exe /dev/null
user222202 answered 2019-06-28T13:27:20Z
2 votes

转义序列必须由SOMETHING解释为转换为颜色。 java从命令行启动时使用的标准CMD.EXE并不支持这一点,因此Java不支持。

Thorbjørn Ravn Andersen answered 2019-06-28T13:27:49Z
1 votes

检查这个:我使用带有转义码的ANSI值,它可能不适用于Windows命令提示符,但在IDE和Unix shell中。你也可以查看“Jansi&#39; 这里的库用于Windows支持。

System.out.println("\u001B[35m" + "This text is PURPLE!" + "\u001B[0m");
Kumar Gaurav Sharma answered 2019-06-28T13:28:20Z
0 votes

System.err.println(&#34; Errorrrrrr&#34;)它将在控制台上以红色打印文本。

Kamran answered 2019-06-28T13:28:49Z
0 votes

我编写了一个名为AnsiScape的库,它允许您以更结构化的方式编写彩色输出:

例:

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

该库还允许您定义自己的&#34;转义类&#34; 类似于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));
Andrei Ciobanu answered 2019-06-28T13:29:39Z
-2 votes

这在日食中起作用只是为了让它变红,不了解其他地方。

System.err.println(" BLABLA ");
joe answered 2019-06-28T13:30:10Z
translate from https://stackoverflow.com:/questions/1448858/how-to-color-system-out-println-output