一直以为System.err是输出运行时的错误信息,呵呵,被现实狠狠打脸!
事实上,System.out.println和System.err.println输出流并没有什么区别,只是在idea中err输出的是红色字体。
关于两者的区别,网上也是众说纷纭,大致:
System.out.println是JVM和操作系统双重缓存的,System.err.println是实时的;
System.out.println可以重定向,System.err.println是只能在控制台显示;
如果使用了log4j的日志记录,System.err会被记入日志,System.out不会。
根据JDK API的描述:
image.png
System.out.println 标准输出流,System.err.println 标准错误输出流;
System.err.println 需要立即让用户注意到的信息的输出,即使System.out.println被重定向;
System.out.println 不连续的;
System.out.println 可以重定向。
测试缓存:
for (int i = 0; i < 3; i++) {
System.out.pintln("out");
System.out.pintln("err");
}
测试发现输出是随机的:
out
out
out
err
err
err
也有:
out
err
err
out
err
out
所以,System.out.println和System.err.println都进行缓存,原因是out和err都是流,只不过一个是标准流一个是标准错误流。
测试重定向:
final var errPS = new PrintStream(new FileOutputStream("test_err.txt"));
System.setErr(errPS);
System.err.println("hello world!!");
final var outPS = new PrintStream(new FileOutputStream("test_out.txt"));
System.setOut(outPS);
System.out.println("hello world!!");
结果显示其输出都被重定向到各自指定相应的文件,我使用的JDK是JDK11.2。
测试记入日志:
image.png
image.png
image.png
结果显示没有记入日志,有可能因为我使用的是Log4j 2。