一、System.out.println 能重定向到别的输出流,这样的话你在屏幕上将看不到打印的东西了,
而System.err.println只能在屏幕上实现打印,即便你重定向了也同样。
System.setOut(new PrintStream(new FileOutputStream(new File( "c:/test.txt "))));
System.out.println( "haha ");
二、
当向控制台输出信息时,开发者有两个选择:System.out和System.err。使用者更倾向于输出的是System.out,而若是是 System.err则输出“error”。尽管这看起来是显而易见的,但不少开发者都不了解为何出错和调试时使用System.err。
当输出一个流时,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仍然存在于缓存中,结果也就丢失了。
使用System.err来报告错误、调试程序就能够避免这种状况出现,它将使每一次操做的结果都输出出来。例如如下程序:
for(int i=0; i<56; i++) {
System.err.println(i);
... // containing an error
}
在每一次i等于54时都将显示错误信息。
三、System.out.println可能会被缓冲,而System.err.println不会
四、System.err和System.out 就是错误输出和标准输出
若是你用LOG4J记录日志的话,且设定错误等级的话
System.err的输出是将记录到日志中
五、输出设备是同样的 因此你看到的是同样的
System.setErr() System.setOut() 是重定向两个流的方法。
如下为Sun JDK1.5中文文档中的 可能有点泛泛了
------------------------------
System.err
“标准”错误输出流。此流已打开并准备接受输出数据。
一般,此流对应于显示器输出或者由主机环境或用户指定的另外一个输出目标。按照惯例,此输出流用于显示错误消息,或者显示那些即便用户输出流(变量 out 的值)已经重定向到一般不被连续监视的某一文件或其余目标,也应该马上引发用户注意的其余信息。
System.out
“标准”输出流。此流已打开并准备接受输出数据。一般,此流对应于显示器输出或者由主机环境或用户指定的另外一个输出目标。
六、System.err.println()是要缓冲的,因此优先级会高点,而System.out.println()是不须要缓冲的,因此优先级会低点.