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

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

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值