Java中控制台字符串颜色无法恢复为白色的问题解决
问题分析与解决方案
问题原因
- 第17行:执行
c=red+c+reset后,变量c的内容已经是红色ANSI序列+C+重置序列。后续执行c=white+c+reset,最终字符串变为白色序列+红色序列+C+重置序列+重置序列。控制台解析ANSI序列时,后出现的颜色指令会覆盖前面的,所以实际生效的是红色序列,导致输出红色。 - 第23行:执行
d=red+d后,d的内容是红色序列+D,再执行d=white+d得到白色序列+红色序列+D,同样,后出现的红色序列覆盖了白色指令,输出红色。
修改方案
核心原则是始终基于原始无格式的字符串构建带颜色的输出,不要在已包含ANSI序列的字符串上叠加新颜色指令。
方案一:保留原始字符串,直接构建输出
修改后代码如下:
class Main { public static final String reset="\u001B[0m"; public static final String red="\u001B[31m"; public static final String white="\u001B[37m"; public static void main(String[] args) { System.out.println("A"); System.out.println(red+"A"+reset); System.out.println(white+"A"+reset); String b="B"; System.out.println(b); System.out.println(red+b+reset); System.out.println(white+b+reset); String c="C"; System.out.println(c); // 基于原始c生成红色输出,不修改原始变量 System.out.println(red+c+reset); // 基于原始c生成白色输出 System.out.println(white+c+reset); // 现在输出白色C String d="D"; System.out.println(d); // 基于原始d生成红色输出,不修改原始变量 System.out.println(red+d+reset); // 基于原始d生成白色输出 System.out.println(white+d+reset); // 现在输出白色D } }
方案二:单独存储原始字符串(适合多次复用场景)
如果需要多次对同一内容设置不同颜色,可以把原始字符串单独存储,避免修改带格式的变量:
class Main { public static final String reset="\u001B[0m"; public static final String red="\u001B[31m"; public static final String white="\u001B[37m"; public static void main(String[] args) { System.out.println("A"); System.out.println(red+"A"+reset); System.out.println(white+"A"+reset); String b="B"; System.out.println(b); System.out.println(red+b+reset); System.out.println(white+b+reset); // 单独存储原始字符串 String originalC = "C"; String c=originalC; System.out.println(c); c=red+originalC+reset; System.out.println(c); c=white+originalC+reset; System.out.println(c); // 输出白色C String originalD = "D"; String d=originalD; System.out.println(d); d=red+originalD+reset; System.out.println(d); d=white+originalD+reset; System.out.println(d); // 输出白色D } }
内容的提问来源于stack exchange,提问作者allb
相关产品推荐
相关产品推荐

