更改终端中不同流的输出颜色

Change color of output for different stream in terminal

首先要澄清的是,我不是在谈论改变某些 ide 附属终端的颜色,而是在普通终端。

其次我的问题:

我有 2 个输出流都打印到 system.out 和 system.err 但我希望 system.err 一个以红色打印但是代码只需要一个流并调用 print 它是太大而无法单独更改所有行所以有没有一种方法可以使 System.err 的所有输出都是红色的,而 System.out 将是正常的

我尝试在 System.err 的代码段之前添加 ANSI RED 转义码,但随后输出也打印为红色 我怎么能只有错误作为红色输出!

我现在的代码:

public class Main {
    public static final String ANSI_RED = "\u001B[31m";
    public static final String ANSI_RESET = "3[0m";
    public static void main(String[] args) {
        System.err.print(ANSI_RED);        
        doSomePrinting(System.out, System.err); // This is some method which prints both to System.out and System.err
        System.err.print(ANSI_RESET);        
    }
}

但是 inside 当我打印到 System.err 时,do something 方法是红色的,但 System.out 也变成红色!

如何解决这个问题?

注意:请不要建议在我打印到 System.err 之前和之后打印 ANSI_RED 和 ANSI_RESET 我知道这是一个解决方案,但是打印丢失了很难做到,如果没有其他可能的话,这将是我最后的选择!

因此,正如评论中所建议的那样,我 class 扩展了 PrintStream 并覆盖了 print and println` 方法。

我的PrintStreamclass:

public class ErrorStreamPrinter extends PrintStream {

    public ErrorStreamPrinter(OutputStream out) {
        super(out, true);
    }

    @Override
    public void print(String s) {
        super.print(Constants.ANSI_RED);
        super.print(s);
        super.print(Constants.ANSI_RESET);
    }

    @Override
    public void println(String s) {
        super.print(Constants.ANSI_RED);
        super.print(s);
        super.println(Constants.ANSI_RESET);
    }
}