Programing

System.out.println을 사용하여 콘솔에서 색상을 인쇄하는 방법은 무엇입니까?

lottogame 2020. 3. 21. 10:09
반응형

System.out.println을 사용하여 콘솔에서 색상을 인쇄하는 방법은 무엇입니까?


콘솔에서 컬러를 인쇄하려면 어떻게해야합니까? 프로세서가 데이터를 보낼 때 데이터를 컬러로 표시하고 데이터를 수신 할 때 다른 컬러로 데이터를 표시하고 싶습니다.


터미널에서 지원하는 경우 ANSI 이스케이프 코드 를 사용하여 출력에 색상을 사용할 수 있습니다 . 일반적으로 유닉스 쉘 프롬프트에서 작동합니다. 그러나 Windows 명령 프롬프트에서는 작동하지 않습니다 (Cygwin에서는 작동하지만). 예를 들어 색상에 대해 다음과 같은 상수를 정의 할 수 있습니다.

public static final String ANSI_RESET = "\u001B[0m";
public static final String ANSI_BLACK = "\u001B[30m";
public static final String ANSI_RED = "\u001B[31m";
public static final String ANSI_GREEN = "\u001B[32m";
public static final String ANSI_YELLOW = "\u001B[33m";
public static final String ANSI_BLUE = "\u001B[34m";
public static final String ANSI_PURPLE = "\u001B[35m";
public static final String ANSI_CYAN = "\u001B[36m";
public static final String ANSI_WHITE = "\u001B[37m";

그런 다음 필요에 따라 참조 할 수 있습니다.

예를 들어, 위 상수를 사용하면 지원되는 터미널에서 다음과 같은 빨간색 텍스트 출력을 만들 수 있습니다.

System.out.println(ANSI_RED + "This text is red!" + ANSI_RESET);

업데이트 : Jansi 라이브러리 를 확인하십시오 . API를 제공하고 JNI를 사용하는 Windows를 지원합니다. 아직 시도하지 않았습니다. 그러나 유망 해 보인다.

업데이트 2 : 또한 텍스트의 배경색을 다른 색으로 변경하려면 다음을 시도하십시오.

public static final String ANSI_BLACK_BACKGROUND = "\u001B[40m";
public static final String ANSI_RED_BACKGROUND = "\u001B[41m";
public static final String ANSI_GREEN_BACKGROUND = "\u001B[42m";
public static final String ANSI_YELLOW_BACKGROUND = "\u001B[43m";
public static final String ANSI_BLUE_BACKGROUND = "\u001B[44m";
public static final String ANSI_PURPLE_BACKGROUND = "\u001B[45m";
public static final String ANSI_CYAN_BACKGROUND = "\u001B[46m";
public static final String ANSI_WHITE_BACKGROUND = "\u001B[47m";

예를 들어 :

System.out.println(ANSI_GREEN_BACKGROUND + "This text has a green background but default text!" + ANSI_RESET);
System.out.println(ANSI_RED + "This text has red text but a default background!" + ANSI_RESET);
System.out.println(ANSI_GREEN_BACKGROUND + ANSI_RED + "This text has a green background and red text!" + ANSI_RESET);

다음은 public static필드 가있는 Java 클래스의 색상 목록입니다.

용법

System.out.println(ConsoleColors.RED + "RED COLORED" +
ConsoleColors.RESET + " NORMAL");


참고RESET 효과가 지워지지 않으면 효과가 유지되므로 인쇄 후 애프터 를 사용하는 것을 잊지 마십시오.


public class ConsoleColors {
    // Reset
    public static final String RESET = "\033[0m";  // Text Reset

    // Regular Colors
    public static final String BLACK = "\033[0;30m";   // BLACK
    public static final String RED = "\033[0;31m";     // RED
    public static final String GREEN = "\033[0;32m";   // GREEN
    public static final String YELLOW = "\033[0;33m";  // YELLOW
    public static final String BLUE = "\033[0;34m";    // BLUE
    public static final String PURPLE = "\033[0;35m";  // PURPLE
    public static final String CYAN = "\033[0;36m";    // CYAN
    public static final String WHITE = "\033[0;37m";   // WHITE

    // Bold
    public static final String BLACK_BOLD = "\033[1;30m";  // BLACK
    public static final String RED_BOLD = "\033[1;31m";    // RED
    public static final String GREEN_BOLD = "\033[1;32m";  // GREEN
    public static final String YELLOW_BOLD = "\033[1;33m"; // YELLOW
    public static final String BLUE_BOLD = "\033[1;34m";   // BLUE
    public static final String PURPLE_BOLD = "\033[1;35m"; // PURPLE
    public static final String CYAN_BOLD = "\033[1;36m";   // CYAN
    public static final String WHITE_BOLD = "\033[1;37m";  // WHITE

    // Underline
    public static final String BLACK_UNDERLINED = "\033[4;30m";  // BLACK
    public static final String RED_UNDERLINED = "\033[4;31m";    // RED
    public static final String GREEN_UNDERLINED = "\033[4;32m";  // GREEN
    public static final String YELLOW_UNDERLINED = "\033[4;33m"; // YELLOW
    public static final String BLUE_UNDERLINED = "\033[4;34m";   // BLUE
    public static final String PURPLE_UNDERLINED = "\033[4;35m"; // PURPLE
    public static final String CYAN_UNDERLINED = "\033[4;36m";   // CYAN
    public static final String WHITE_UNDERLINED = "\033[4;37m";  // WHITE

    // Background
    public static final String BLACK_BACKGROUND = "\033[40m";  // BLACK
    public static final String RED_BACKGROUND = "\033[41m";    // RED
    public static final String GREEN_BACKGROUND = "\033[42m";  // GREEN
    public static final String YELLOW_BACKGROUND = "\033[43m"; // YELLOW
    public static final String BLUE_BACKGROUND = "\033[44m";   // BLUE
    public static final String PURPLE_BACKGROUND = "\033[45m"; // PURPLE
    public static final String CYAN_BACKGROUND = "\033[46m";   // CYAN
    public static final String WHITE_BACKGROUND = "\033[47m";  // WHITE

    // High Intensity
    public static final String BLACK_BRIGHT = "\033[0;90m";  // BLACK
    public static final String RED_BRIGHT = "\033[0;91m";    // RED
    public static final String GREEN_BRIGHT = "\033[0;92m";  // GREEN
    public static final String YELLOW_BRIGHT = "\033[0;93m"; // YELLOW
    public static final String BLUE_BRIGHT = "\033[0;94m";   // BLUE
    public static final String PURPLE_BRIGHT = "\033[0;95m"; // PURPLE
    public static final String CYAN_BRIGHT = "\033[0;96m";   // CYAN
    public static final String WHITE_BRIGHT = "\033[0;97m";  // WHITE

    // Bold High Intensity
    public static final String BLACK_BOLD_BRIGHT = "\033[1;90m"; // BLACK
    public static final String RED_BOLD_BRIGHT = "\033[1;91m";   // RED
    public static final String GREEN_BOLD_BRIGHT = "\033[1;92m"; // GREEN
    public static final String YELLOW_BOLD_BRIGHT = "\033[1;93m";// YELLOW
    public static final String BLUE_BOLD_BRIGHT = "\033[1;94m";  // BLUE
    public static final String PURPLE_BOLD_BRIGHT = "\033[1;95m";// PURPLE
    public static final String CYAN_BOLD_BRIGHT = "\033[1;96m";  // CYAN
    public static final String WHITE_BOLD_BRIGHT = "\033[1;97m"; // WHITE

    // High Intensity backgrounds
    public static final String BLACK_BACKGROUND_BRIGHT = "\033[0;100m";// BLACK
    public static final String RED_BACKGROUND_BRIGHT = "\033[0;101m";// RED
    public static final String GREEN_BACKGROUND_BRIGHT = "\033[0;102m";// GREEN
    public static final String YELLOW_BACKGROUND_BRIGHT = "\033[0;103m";// YELLOW
    public static final String BLUE_BACKGROUND_BRIGHT = "\033[0;104m";// BLUE
    public static final String PURPLE_BACKGROUND_BRIGHT = "\033[0;105m"; // PURPLE
    public static final String CYAN_BACKGROUND_BRIGHT = "\033[0;106m";  // CYAN
    public static final String WHITE_BACKGROUND_BRIGHT = "\033[0;107m";   // WHITE
}

JCDP ( Java Colored Debug Printer ) 라는 라이브러리를 만들었습니다 .

Linux의 경우 WhiteFang에서 언급 한 ANSI 이스케이프 코드를 사용하지만 훨씬 직관적 인 코드 대신 단어를 사용하여 추상화합니다 . 다음과 같이 쉬워집니다.

print("Hello World!", Attribute.BOLD, FColor.YELLOW, BColor.GREEN);

Windows의 경우 JAnsi의존 하지만 위에 표시된 직관적이고 간단한 API를 유지하면서 추상화 계층을 작성합니다.

JCDP의 github repository에 몇 가지 예가 있습니다.


public enum Color {
    //颜色结尾字符串,重置颜色的
    RESET("\033[0m"),

    // Regular Colors 普通颜色,不带加粗,背景色等
    BLACK("\033[0;30m"),    // BLACK
    RED("\033[0;31m"),      // RED
    GREEN("\033[0;32m"),    // GREEN
    YELLOW("\033[0;33m"),   // YELLOW
    BLUE("\033[0;34m"),     // BLUE
    MAGENTA("\033[0;35m"),  // MAGENTA
    CYAN("\033[0;36m"),     // CYAN
    WHITE("\033[0;37m"),    // WHITE

    // Bold
    BLACK_BOLD("\033[1;30m"),   // BLACK
    RED_BOLD("\033[1;31m"),     // RED
    GREEN_BOLD("\033[1;32m"),   // GREEN
    YELLOW_BOLD("\033[1;33m"),  // YELLOW
    BLUE_BOLD("\033[1;34m"),    // BLUE
    MAGENTA_BOLD("\033[1;35m"), // MAGENTA
    CYAN_BOLD("\033[1;36m"),    // CYAN
    WHITE_BOLD("\033[1;37m"),   // WHITE

    // Underline
    BLACK_UNDERLINED("\033[4;30m"),     // BLACK
    RED_UNDERLINED("\033[4;31m"),       // RED
    GREEN_UNDERLINED("\033[4;32m"),     // GREEN
    YELLOW_UNDERLINED("\033[4;33m"),    // YELLOW
    BLUE_UNDERLINED("\033[4;34m"),      // BLUE
    MAGENTA_UNDERLINED("\033[4;35m"),   // MAGENTA
    CYAN_UNDERLINED("\033[4;36m"),      // CYAN
    WHITE_UNDERLINED("\033[4;37m"),     // WHITE

    // Background
    BLACK_BACKGROUND("\033[40m"),   // BLACK
    RED_BACKGROUND("\033[41m"),     // RED
    GREEN_BACKGROUND("\033[42m"),   // GREEN
    YELLOW_BACKGROUND("\033[43m"),  // YELLOW
    BLUE_BACKGROUND("\033[44m"),    // BLUE
    MAGENTA_BACKGROUND("\033[45m"), // MAGENTA
    CYAN_BACKGROUND("\033[46m"),    // CYAN
    WHITE_BACKGROUND("\033[47m"),   // WHITE

    // High Intensity
    BLACK_BRIGHT("\033[0;90m"),     // BLACK
    RED_BRIGHT("\033[0;91m"),       // RED
    GREEN_BRIGHT("\033[0;92m"),     // GREEN
    YELLOW_BRIGHT("\033[0;93m"),    // YELLOW
    BLUE_BRIGHT("\033[0;94m"),      // BLUE
    MAGENTA_BRIGHT("\033[0;95m"),   // MAGENTA
    CYAN_BRIGHT("\033[0;96m"),      // CYAN
    WHITE_BRIGHT("\033[0;97m"),     // WHITE

    // Bold High Intensity
    BLACK_BOLD_BRIGHT("\033[1;90m"),    // BLACK
    RED_BOLD_BRIGHT("\033[1;91m"),      // RED
    GREEN_BOLD_BRIGHT("\033[1;92m"),    // GREEN
    YELLOW_BOLD_BRIGHT("\033[1;93m"),   // YELLOW
    BLUE_BOLD_BRIGHT("\033[1;94m"),     // BLUE
    MAGENTA_BOLD_BRIGHT("\033[1;95m"),  // MAGENTA
    CYAN_BOLD_BRIGHT("\033[1;96m"),     // CYAN
    WHITE_BOLD_BRIGHT("\033[1;97m"),    // WHITE

    // High Intensity backgrounds
    BLACK_BACKGROUND_BRIGHT("\033[0;100m"),     // BLACK
    RED_BACKGROUND_BRIGHT("\033[0;101m"),       // RED
    GREEN_BACKGROUND_BRIGHT("\033[0;102m"),     // GREEN
    YELLOW_BACKGROUND_BRIGHT("\033[0;103m"),    // YELLOW
    BLUE_BACKGROUND_BRIGHT("\033[0;104m"),      // BLUE
    MAGENTA_BACKGROUND_BRIGHT("\033[0;105m"),   // MAGENTA
    CYAN_BACKGROUND_BRIGHT("\033[0;106m"),      // CYAN
    WHITE_BACKGROUND_BRIGHT("\033[0;107m");     // WHITE

    private final String code;

    Color(String code) {
        this.code = code;
    }

    @Override
    public String toString() {
        return code;
    }
}



    System.out.print(Color.BLACK_BOLD);
    System.out.println("111111111aaaaaaaaaaaaaaaa==============");
    System.out.print(Color.RESET);

    System.out.print(Color.BLUE_BACKGROUND);
    System.out.print(Color.YELLOW); //设置前景色 为YELLOW
    System.out.println("111111111aaaaaaaaaaaaaaaa==============马哥私房菜");
    System.out.println("111111111aaaaaaaaaaaaaaaa==============马哥私房菜");
    System.out.println("111111111aaaaaaaaaaaaaaaa==============马哥私房菜");
    System.out.println("111111111aaaaaaaaaaaaaaaa==============马哥私房菜");
    System.out.print(Color.RESET);

이를 수행하는 상당히 이식 가능한 방법은 원시 이스케이프 시퀀스를 사용하는 것입니다. http://en.wikipedia.org/wiki/ANSI_escape_code를 참조하십시오

[2017-02-20의 user9999999에 대해 편집 됨]

Java는 "코드를 처리"하지 않지만, 사실 Java는 사용자가 지시 한 내용을 출력하도록 출력합니다. Windows 콘솔이 ESC (chr (27))를 다른 글리프 (←)로 취급한다는 것은 Java의 잘못이 아닙니다.

당신은 내가 Windows로 부팅하게했다.  너 나에게 빚진


ANSI 이스케이프 시퀀스를 사용하여이 작업을 수행 할 수 있습니다. 실제로이 간단한 해결 방법을 원하는 사람을 위해이 클래스를 Java로 작성했습니다. 단순한 색상 코드 이상의 것을 허용합니다.

https://gist.github.com/nathan-fiscaletti/9dc252d30b51df7d710a

( https://github.com/nathan-fiscaletti/ansi-util에서 제공 )

사용 예 :

StringBuilder sb = new StringBuilder();

System.out.println(
    sb.raw("Hello, ")
      .underline("John Doe")
      .resetUnderline()
      .raw(". ")
      .raw("This is ")
      .color16(StringBuilder.Color16.FG_RED, "red")
      .raw(".")
);

누구나 빠른 솔루션을 찾고 있다면 다음 도우미 클래스를 자유롭게 사용하십시오. :)

public class Log {

    public static final String ANSI_RESET = "\u001B[0m";
    public static final String ANSI_BLACK = "\u001B[30m";
    public static final String ANSI_RED = "\u001B[31m";
    public static final String ANSI_GREEN = "\u001B[32m";
    public static final String ANSI_YELLOW = "\u001B[33m";
    public static final String ANSI_BLUE = "\u001B[34m";
    public static final String ANSI_PURPLE = "\u001B[35m";
    public static final String ANSI_CYAN = "\u001B[36m";
    public static final String ANSI_WHITE = "\u001B[37m";

    //info
    public static void i(String className, String message) {
        System.out.println(ANSI_GREEN + className + " : " + message + ANSI_RESET);
    }

    //error
    public static void e(String className, String message) {
        System.out.println(ANSI_RED + className + " : " + message + ANSI_RESET);
    }

    //debug
    public static void d(String className, String message) {
        System.out.println(ANSI_BLUE + className + " : " + message + ANSI_RESET);
    }

    //warning
    public static void w(String className, String message) {
        System.out.println(ANSI_YELLOW + className + " : " + message + ANSI_RESET);
    }

}

용법:

Log.i(TAG,"This is an info message");

Log.e(TAG,"This is an error message");

Log.w(TAG,"This is a warning message");

Log.d(TAG,"This is a debug message");

ANSI 코드에 대해 @ whiteFang34에게 감사합니다.


콘솔 텍스트를 색칠하는 가장 좋은 방법은 ANSI 이스케이프 코드 를 사용하는 것 입니다. ANSI 이스케이프 코드는 텍스트 색상 외에도 배경 색상, 장식 등을 허용합니다.

유닉스

springboot를 사용하는 경우 텍스트 색상 지정을위한 특정 열거 형이 있습니다. org.springframework.boot.ansi.AnsiColor

Jansi 라이브러리는 조금 더 고급이며 (모든 ANSI 이스케이프 코드 함수를 사용할 수 있음) API를 제공하며 JNA를 사용 하는 Windows지원합니다 .

그렇지 않으면 다른 응답과 같이 자신의 색상을 수동으로 정의 할 수 있습니다.

윈도우 10

Windows 10 (빌드 10.0.10586-2015 년 11 월부터)은 ANSI 이스케이프 코드 ( MSDN 문서 )를 지원 하지만 기본적으로 활성화되어 있지 않습니다. 사용하려면 다음을 수행하십시오.

  • SetConsoleMode의 API 를 사용 ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)플래그. Jansi는이 옵션을 사용합니다.
  • SetConsoleMode API를 사용하지 않으면 HKEY_CURRENT_USER\Console\VirtualTerminalLeveldword를 작성 하여 글로벌 레지스트리 키를 변경하고 ANSI 처리를 위해 0 또는 1로 설정할 수 있습니다."VirtualTerminalLevel"=dword:00000001

Windows 10 이전

Windows 콘솔은 ANSI 색상을 지원하지 않습니다. 그러나 콘솔을 사용하는 것이 가능합니다.


Kotlin (Java와 완벽하게 작동)을 사용하면 다음과 같은 열거 형을 만들 수 있습니다.

enum class AnsiColor(private val colorNumber: Byte) {
    BLACK(0), RED(1), GREEN(2), YELLOW(3), BLUE(4), MAGENTA(5), CYAN(6), WHITE(7);

    companion object {
        private const val prefix = "\u001B"
        const val RESET = "$prefix[0m"
        private val isCompatible = "win" !in System.getProperty("os.name").toLowerCase()
    }

    val regular get() = if (isCompatible) "$prefix[0;3${colorNumber}m" else ""
    val bold get() = if (isCompatible) "$prefix[1;3${colorNumber}m" else ""
    val underline get() = if (isCompatible) "$prefix[4;3${colorNumber}m" else ""
    val background get() = if (isCompatible) "$prefix[4${colorNumber}m" else ""
    val highIntensity get() = if (isCompatible) "$prefix[0;9${colorNumber}m" else ""
    val boldHighIntensity get() = if (isCompatible) "$prefix[1;9${colorNumber}m" else ""
    val backgroundHighIntensity get() = if (isCompatible) "$prefix[0;10${colorNumber}m" else ""
}

그런 다음 사용은 다음과 같습니다 (아래 코드는 모든 색상에 대해 다른 스타일을 보여줍니다)

val sampleText = "This is a sample text"
enumValues<AnsiColor>().forEach { ansiColor ->
    println("${ansiColor.regular}$sampleText${AnsiColor.RESET}")
    println("${ansiColor.bold}$sampleText${AnsiColor.RESET}")
    println("${ansiColor.underline}$sampleText${AnsiColor.RESET}")
    println("${ansiColor.background}$sampleText${AnsiColor.RESET}")
    println("${ansiColor.highIntensity}$sampleText${AnsiColor.RESET}")
    println("${ansiColor.boldHighIntensity}$sampleText${AnsiColor.RESET}")
    println("${ansiColor.backgroundHighIntensity}$sampleText${AnsiColor.RESET}")
}

이러한 ANSI 코드가 지원되지 않는 Windows에서 실행중인 경우 isCompatible검사는 코드를 빈 문자열로 바꾸어 문제를 방지합니다.

참고 URL : https://stackoverflow.com/questions/5762491/how-to-print-color-in-console-using-system-out-println

반응형