如何给System.out.println输出上色?

我如何为Java输出着色?

例如在C和其他语言中,我可以使用ANSI-escape类似于\033[0m来做到这一点。 但在Java中,它不起作用。

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

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

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

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

快速提示:在大多数情况下,在terminal中更改terminal中的颜色和其他文本属性的下列转义序列不能工作。 我想你可以以某种方式在Window的CMD启用转义序列,但我不记得如何。

最简单的方法是使用转义字符。 在某些平台上,一些转义序列不起作用,我发现你不能简单地使用反斜杠作为转义键(就像String s = "\[36mbla-bla-bla";而是你必须使用escape从int到char的字符(27)(即String s = (char)27 + "[36mbla-bla-bla";如果你现在做System.out.println(s);你会看到在控制台青色的文本,请参阅下面的可能的ANSI值的表格。要使用多个值,只需用分号分隔它们即可。

ANSI表: 维基百科 – ANSI转义代码

快速参考:

  • 30黑色
  • 31红
  • 32绿色
  • 33黄色
  • 34蓝色
  • 35洋红色
  • 36青色
  • 37白色
  • 40黑色的背景
  • 41红色的背景
  • 42绿色的背景
  • 43黄色背景
  • 44蓝色背景
  • 45品红背景
  • 46青色背景
  • 47白色背景
  • 1明亮(通常只是粗体)
  • 21停亮(标准化大胆)
  • 4强调
  • 24停下划线
  • 0清除所有格式

因此, System.out.println((char)27 + "[34;43mBlue text with yellow background"); 会给你带有黄色背景的蓝色文字。

此外,请注意(如上述超链接表中所述)有许多属性更改序列不起作用,但在大多数平台上,颜色更改属性将起作用。 我会build议您在电脑上尝试使用这些不同的转义序列,但请注意,这不会是便携式的。

另外,您可以使用"\e[31;1m"等转义序列。 所以如果你做printf "\e[31;1mWhat color?\e[0m"; 在你的unixterminal( 不要在java System.out.println("\e[31;1mred\e[0m"); …这将给你一个illegal escape character编译错误),你会看到What color? 在明亮的红色。 "\e[31;1m""\x1b[31;1m"在Linux中是等价的,但我认为Macterminal只支持"\e[31;1m" 。 (这实际上是基于正在运行的shell,所以"\e[...m"只能在支持转义序列的shell中工作 – 我认为这将是其中的大部分)。

在大多数Linux发行版上,你也可以做Ctrl + ctrl [ 。 这和"\e" 。 因此,你可以做echo "^[[34;1mWhat color?^[[0m"你会看到What color? 在明亮的蓝色。 ^[是你必须做ctrl v + ctrl [

对于那些熟悉Linux的人来说,你可能知道echo 不能解释像printf这样的转义序列。 echo -e不只是echo 。 在上面的例子中,我只是用普通的旧echo做了一个转义序列,但是我看到了颜色。 “这个怎么用?” 你可能会问。 当你做CTRL + CTRL [你正在打印只有一个字符。 所以 ,echo不会解释一个转义序列,它只是需要这个字符(这在技术上是一个转义字符,我猜,就像在java中做(char)27 + "..." ,但是我们不是在java )并将其写入标准输出。

这对于实际上不能解释转义序列的shell是有用的。 例如,转到你的Unixterminal(它可能会运行bash当你开始),然后键入bash 。 这会给你一个bash shell。 如果你做了printf "\e[31;1mred?\e[0m\n"; 它会打印red? 在明亮的红色。 退出typesexit 。 现在inputsh运行一个sh shell。 再inputprintf "\e31;1mred?\e[0m\n"; 你会看到\e[31;1mred?\e[0m 不是红色的。 sh shell显然没有解释转义序列,但它清楚地读取字符,所以我们可以通过做ctrl v + ctrl [强制颜色。 所以, printf "^[[31;1mred?^[[0m\n" would in fact yield鲜红色的红色。 :d

最后一个注意:你可以在支持这个(gnome-terminal,xterm,konsole等 – 也就是大多数x-windowterminal)的terminal中使用256种颜色。 要查看所有这些颜色,只需在terminal中运行: for i in {1..255}; do printf "\e[0m$i: \e[38;05;${i}mCOLOR TEST 123\n"; done; for i in {1..255}; do printf "\e[0m$i: \e[38;05;${i}mCOLOR TEST 123\n"; done;

这对我有效:

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

你需要结尾“37m”才能将颜色还原成白色(或者你正在使用的任何东西)。 如果你不这样做,它可能会使“红色”的一切。

是的,这是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(); } } 

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

我创build了一个名为JCDP ( Java Colored Debug Printer )的jar库。

对于Linux,它使用WhiteFang提到的ANSI转义代码,但是使用单词而不是代码更直观。

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

这个图书馆是根据麻省理工学院许可证授权的,因此可以随意使用它

看看JCDP的github存储库 。

这是一个Win32控制台的解决scheme。

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

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

第二种最简单的方法是在普通的Windows控制台中运行程序(也是未修改的),通过tee.exe(Cygwin或Git发行版)对其输出进行stream水线处理。 Tee.exe将识别转义码并调用相应的WinAPI函数。

就像是:

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

转义序列必须被SOMETHING解释为转换为颜色。 Java从命令行启动时使用的标准CMD.EXE不支持这个,所以Java不支持。

检查了这一点:我用转义代码ANSI值,它可能不适用于Windows命令提示符,但在IDE和Unixshell。 你也可以在这里查看'Jansi'库以获得Windows支持。

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

System.err.println(“Errorrrrrr”)它将在控制台上以红色打印文本。

我写了一个名为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)); 

这在eclipse中只是把它变成红色,不知道其他地方。

 System.err.println(" BLABLA ");