Bagaimana cara mencetak warna di konsol menggunakan System.out.println?
326
Bagaimana saya bisa mencetak warna di konsol? Saya ingin menampilkan data dalam warna saat prosesor mengirim data dan warna berbeda saat menerima data.
Jika konsol mendukung (misalnya konsol Java Eclipse) menyesuaikan warna stdout / stderr, maka Anda dapat menggunakan System.out.println untuk satu warna dan System.err.println untuk warna lain.
jw_
Jawaban:
585
Jika terminal Anda mendukungnya, Anda dapat menggunakan kode pelarian ANSI untuk menggunakan warna pada output Anda. Ini umumnya bekerja untuk prompt shell Unix; Namun, itu tidak bekerja untuk Windows Command Prompt (Meskipun, itu berfungsi untuk Cygwin). Misalnya, Anda bisa mendefinisikan konstanta seperti ini untuk warna:
Misalnya, menggunakan konstanta di atas, Anda dapat membuat output teks merah berikut pada terminal yang didukung:
System.out.println(ANSI_RED +"This text is red!"+ ANSI_RESET);
Pembaruan: Anda mungkin ingin memeriksa perpustakaan Jansi . Ini menyediakan API dan memiliki dukungan untuk Windows menggunakan JNI. Saya belum mencobanya; Namun, itu terlihat menjanjikan.
Pembaruan 2: Juga, jika Anda ingin mengubah warna latar belakang teks ke warna yang berbeda, Anda dapat mencoba yang berikut ini juga:
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);
@ WhiteFang34 Bisakah Anda jelaskan apa gunanya RESET jika warnanya HITAM, setidaknya di konsol saya? Apakah ini seperti default atau sth.?
Boro
8
@Boro: kode reset mematikan semua atribut ANSI yang ditetapkan sejauh ini, yang seharusnya mengembalikan konsol ke pengaturan default. Ini berguna jika Anda tidak tahu warna default atau juga menggunakan beberapa atribut lain seperti warna latar belakang, gaya font, dll.
WhiteFang34
2
jansi benar-benar hebat! bagi mereka yang berkembang di eclipse, saya dapat merekomendasikan plugin ini: mihai-nita.net/2013/06/03/eclipse-plugin-ansi-in-console dan sepotong kode yang bagus untuk mengaktifkan warna jika kode tidak dieksekusi di konsol:if (System.console() == null) System.setProperty("jansi.passthrough", "true");
Danny Lo
1
@PankajNimgade, baca jawabannya lagi dan Anda mungkin akan memperhatikan ini:however it doesn't work for Windows command prompt
Felix Edelmann
1
@DannyLo Terima kasih banyak atas tautannya ke plugin Eclipse!
Noah Broyles
72
Berikut adalah daftar warna dalam kelas Java dengan public staticbidang
Saya membuat perpustakaan yang disebut JCDP ( Java Colored Debug Printer ).
Untuk Linux, macOS, dan Windows 10, ia menggunakan kode pelarian ANSI yang WhiteFang sebutkan, tetapi mengabstraksi mereka menggunakan kata - kata alih-alih kode yang jauh lebih intuitif. Menjadi semudah:
enumColor{//Color end string, color reset
RESET("\033[0m"),// Regular Colors. Normal color, no bold, background color etc.
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");// WHITEprivatefinalString code;Color(String code){this.code = code;}@OverridepublicString toString(){return code;}}
Java tidak "menangani kode", itu benar, tetapi Java menampilkan apa yang Anda kirim ke output. itu bukan kesalahan Java bahwa konsol Windows memperlakukan ESC (chr (27)) hanya sebagai mesin terbang lain (←).
yang tidak berfungsi karena lapisan Java IO tidak mengonversinya menjadi warna. System.out.println ((char) 27 + "[31; 1mERROR" + (char) 27 + "[0m" hanya menghasilkan "[31; 1mERROR [0m" saat dijalankan dari jendela cmd.com sebagai .jar yang dapat dieksekusi .jar
simpleuser
pertanyaan tidak ditandai windows. konsol Windows tidak pernah sesuai dengan ANSI yang saya ingat.
jcomeau_ictx
tetapi masalahnya adalah bahwa java tidak menangani kode, terlepas dari dukungan
cmd.com
3
lihat jawaban yang diedit. Java melakukan persis seperti yang diperintahkan. masalahnya adalah konsol yang tidak sesuai dengan ANSI.
jcomeau_ictx
1
Saya memiliki masalah yang sama
sgrillon
7
Anda bisa melakukan ini menggunakan urutan pelarian ANSI. Saya sebenarnya telah mengumpulkan kelas ini di Jawa untuk siapa saja yang ingin solusi sederhana untuk ini. Ini memungkinkan lebih dari sekedar kode warna.
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");
Cara terbaik untuk mewarnai teks konsol adalah dengan menggunakan kode pelarian ANSI . Selain warna teks, kode pelarian ANSI memungkinkan warna latar belakang, dekorasi, dan lainnya.
Perpustakaan Jansi sedikit lebih maju (dapat menggunakan semua fonctions kode pelarian ANSI), menyediakan API dan memiliki dukungan untuk Windows menggunakan JNA.
Jika tidak, Anda dapat secara manual menentukan warna Anda sendiri, seperti yang ditunjukkan adalah respons lain.
Windows 10
Windows 10 (sejak build 10.0.10586 - nov. 2015) mendukung kode pelarian ANSI ( dokumentasi MSDN ) tetapi tidak diaktifkan secara default. Untuk mengaktifkannya:
Dengan SetConsoleMode API , gunakan ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)flag. Jansi menggunakan opsi ini.
Jika SetConsoleMode API tidak digunakan, dimungkinkan untuk mengubah kunci registri global HKEY_CURRENT_USER\Console\VirtualTerminalLeveldengan membuat kata kunci dan mengaturnya ke 0 atau 1 untuk pemrosesan ANSI:
"VirtualTerminalLevel"=dword:00000001
Sebelum Windows 10
Konsol Windows tidak mendukung warna ANSI. Tetapi dimungkinkan untuk menggunakan konsol yang berfungsi.
"Downvote" bukan milik saya - tetapi, ada jawaban lain yang memberikan pertanyaan OP, dan mereka diposting beberapa waktu lalu. Saat mengirim jawaban, lihat: Bagaimana saya menulis jawaban yang baik? , harap pastikan Anda menambahkan solusi baru, atau penjelasan yang jauh lebih baik, terutama saat menjawab pertanyaan yang lebih lama.
help-info.de
7
@ iSahil ini mungkin diturunkan karena hanya menulis ke kesalahan standar tidak secara eksplisit mewarnai apa pun. Banyak IDE dan konsol akan menafsirkan pesan kesalahan dan mencetaknya dengan warna merah atau serupa, tetapi itu bukan sesuatu yang bisa Anda andalkan.
David
1
Meskipun ini bukan jawaban langsung untuk pertanyaan yang diajukan di atas, ini adalah jawaban yang saya cari ketika mencari "java print in red console". Jadi, saya merasa tempat ini ada di halaman ini.
Maude
-2
Jika Anda menggunakan Kotlin (yang berfungsi mulus dengan Java), Anda dapat membuat enum seperti itu:
enumclassAnsiColor(private val colorNumber:Byte){
BLACK(0), RED(1), GREEN(2), YELLOW(3), BLUE(4), MAGENTA(5), CYAN(6), WHITE(7);
companion object {privateconst 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""}
Dan kemudian gunakan seperti itu: (kode di bawah ini menunjukkan gaya yang berbeda untuk semua warna)
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}")}
Jika berjalan pada Windows di mana kode ANSI ini tidak didukung, isCompatiblepemeriksaan menghindari masalah dengan mengganti kode dengan string kosong.
Jawaban:
Jika terminal Anda mendukungnya, Anda dapat menggunakan kode pelarian ANSI untuk menggunakan warna pada output Anda. Ini umumnya bekerja untuk prompt shell Unix; Namun, itu tidak bekerja untuk Windows Command Prompt (Meskipun, itu berfungsi untuk Cygwin). Misalnya, Anda bisa mendefinisikan konstanta seperti ini untuk warna:
Kemudian, Anda bisa merujuk yang diperlukan.
Misalnya, menggunakan konstanta di atas, Anda dapat membuat output teks merah berikut pada terminal yang didukung:
Pembaruan: Anda mungkin ingin memeriksa perpustakaan Jansi . Ini menyediakan API dan memiliki dukungan untuk Windows menggunakan JNI. Saya belum mencobanya; Namun, itu terlihat menjanjikan.
Pembaruan 2: Juga, jika Anda ingin mengubah warna latar belakang teks ke warna yang berbeda, Anda dapat mencoba yang berikut ini juga:
Misalnya:
sumber
if (System.console() == null) System.setProperty("jansi.passthrough", "true");
however it doesn't work for Windows command prompt
Berikut adalah daftar warna dalam kelas Java dengan
public static
bidangPemakaian
Catatan Jangan lupa untuk menggunakan
RESET
setelah pencetakan karena efeknya akan tetap jika tidak dihapussumber
Saya membuat perpustakaan yang disebut JCDP ( Java Colored Debug Printer ).
Untuk Linux, macOS, dan Windows 10, ia menggunakan kode pelarian ANSI yang WhiteFang sebutkan, tetapi mengabstraksi mereka menggunakan kata - kata alih-alih kode yang jauh lebih intuitif. Menjadi semudah:
Anda memiliki beberapa contoh di repositori github JCDP .
sumber
Coba enum berikut:
Dan sekarang kita akan membuat contoh kecil:
sumber
Cara yang cukup portabel untuk melakukannya adalah dengan urutan pelarian yang mentah. Lihat http://en.wikipedia.org/wiki/ANSI_escape_code
[diedit untuk user9999999 pada 2017-02-20]
Java tidak "menangani kode", itu benar, tetapi Java menampilkan apa yang Anda kirim ke output. itu bukan kesalahan Java bahwa konsol Windows memperlakukan ESC (chr (27)) hanya sebagai mesin terbang lain (←).
sumber
windows
. konsol Windows tidak pernah sesuai dengan ANSI yang saya ingat.Anda bisa melakukan ini menggunakan urutan pelarian ANSI. Saya sebenarnya telah mengumpulkan kelas ini di Jawa untuk siapa saja yang ingin solusi sederhana untuk ini. Ini memungkinkan lebih dari sekedar kode warna.
https://gist.github.com/nathan-fiscaletti/9dc252d30b51df7d710a
(Porting dari: https://github.com/nathan-fiscaletti/ansi-util )
Contoh Penggunaan:
sumber
Jika ada yang mencari solusi cepat, jangan ragu untuk menggunakan kelas pembantu berikut ini :)
PEMAKAIAN:
Terima kasih @ whiteFang34 untuk kode ANSI.
sumber
Cara terbaik untuk mewarnai teks konsol adalah dengan menggunakan kode pelarian ANSI . Selain warna teks, kode pelarian ANSI memungkinkan warna latar belakang, dekorasi, dan lainnya.
Unix
Jika Anda menggunakan springboot, ada enum khusus untuk pewarnaan teks: org.springframework.boot.ansi.AnsiColor
Perpustakaan Jansi sedikit lebih maju (dapat menggunakan semua fonctions kode pelarian ANSI), menyediakan API dan memiliki dukungan untuk Windows menggunakan JNA.
Jika tidak, Anda dapat secara manual menentukan warna Anda sendiri, seperti yang ditunjukkan adalah respons lain.
Windows 10
Windows 10 (sejak build 10.0.10586 - nov. 2015) mendukung kode pelarian ANSI ( dokumentasi MSDN ) tetapi tidak diaktifkan secara default. Untuk mengaktifkannya:
ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0400)
flag. Jansi menggunakan opsi ini.HKEY_CURRENT_USER\Console\VirtualTerminalLevel
dengan membuat kata kunci dan mengaturnya ke 0 atau 1 untuk pemrosesan ANSI:"VirtualTerminalLevel"=dword:00000001
Sebelum Windows 10
Konsol Windows tidak mendukung warna ANSI. Tetapi dimungkinkan untuk menggunakan konsol yang berfungsi.
sumber
Menggunakan fungsi warna untuk mencetak teks dengan warna
Kode:
Pemakaian:
sumber
Untuk mogok:
sumber
Solusi terbaik untuk mencetak teks apa pun dalam warna merah di Jawa adalah:
sumber
Jika Anda menggunakan Kotlin (yang berfungsi mulus dengan Java), Anda dapat membuat enum seperti itu:
Dan kemudian gunakan seperti itu: (kode di bawah ini menunjukkan gaya yang berbeda untuk semua warna)
Jika berjalan pada Windows di mana kode ANSI ini tidak didukung,
isCompatible
pemeriksaan menghindari masalah dengan mengganti kode dengan string kosong.sumber