区别一
System.in(标准输入流),System.out(标准输出流),System.err(标准错误输出流)
- err是运行期异常和错误反馈的输出流的方向
通常, err 对应于显示器输出或者由主机环境或用户指定的另一个输出目标。按照惯例,此输出流用于显示错误消息,或者显示那些即使用户输出流(变量out的值)已经重定向到通常不被连续监视的某一文件或其他目标,也应该立刻引起用户注意的其他信息。
通常, out 对应于显示器输出或者由主机环境或用户指定的另一个输出目标。
区别二
- 在语言层面的实现三个文件描述符都是可以重定向的
- 在unix shell或windows command line中使用管道或重定向,则只是针对标准输入和输出
System.out.println 能重定向到别的输出流,在屏幕上将看不到打印的东西,
System.err.println 只能在屏幕上实现打印,即使你重定向了也一样
System.setOut(new PrintStream(new FileOutputStream(new File("c:/test.txt "))));
System.out.println( "haha ");
System.setErr() System.setOut() 是重定向两个流的方法。
区别三
- 标准输出往往是带缓存的,而标准出错没有缓存(默认设置,可以改)
public class TestCodeSeg {
static {
System.out.println("1");
}
{
System.out.println("2");
}
public TestCodeSeg(){
System.err.println("3");
}
public static void main(String[] args) {
new TestCodeSeg();
}
}
===> 1,2顺序不变,3输出不定位置不定 可能在输出1或2,还没有输出换行时输出3。err是没有缓冲的,所以“3”的输出是随机的
- System.out.println输出有缓存,优先级低;System.err.println是立即输出,优先级高
- System.out.println可能会被缓冲;System.err.println不会
情况一:
- 当输出一个流时,JVM和操作系统共同决定何时输出这个流。也就是说,尽管开发者键入了:
System.out.print("Test Output:");
- JVM和操作系统的组合体并不会立即输出这个流。相反,它将保持等待状态直到将要输出的东西达到一定的量。
情况二:
假设输入以下指令:
System.out.println(“Debugging Info.”);
- JVM可能同意输出;操作系统可能决定暂不输出。
由于这个原因,在调试程序时想要发现出错的位置就有可能成为问题:
for(int i=0; i<56; i++) {
System.out.println(i);
... // containing an error
}
====》 错误可能出现在i等于54时,但是可能JVM在i等于49时就结束输出了。50到54仍然存在于缓存中,结果也就丢失了。
for(int i=0; i<56; i++) {
System.err.println(i);
... // containing an error
}
====》 在每一次i等于54时都将显示错误信息。
区别四
- 用err打印出的 字符串,再eclipse的console会显示成红色
- log4j记录日志且设定错误等级,System.err的输出将记录到日志中
参考文档:
https://blog.csdn.net/lydong_/article/details/79812507
https://blog.csdn.net/u014753393/article/details/49259215#
System.out.println()和System.err.println()