【转】Java基础:System.out.println与System.err.println的区别

同时使用了System.out.println与System.err.println()打印输入内容,结果看到的内容和预想的不一样,顺序与预料的不同并不是因为err和out的区别导致,而是因为他们是两个流,由于缓存原因导致输出顺序不同。
1、System.out.println   能重定向到别的输出流,这样的话你在屏幕上将看不到打印的东西了,  
 System.err.println    只能在屏幕上实现打印,即使你重定向了也一样。

2、当向控制台输出信息时,开发者有两个选择:System.out和System.err。使用者更倾向于输出的是System.out,而如果是 System.err则输出“error”。尽管这看起来是显而易见的,但很多开发者都不了解为什么出错和调试时使用System.err。(如果你使用err打印出的字符串,在eclipse的console会显示成红色的哦。)  

  当输出一个流时,JVM和操作系统共同决定何时输出这个流。也就是说,尽管开发者键入了:  

[java] view plain copy
 
 print?
  1. System.out.print("Test Output:");   

  

  JVM和操作系统的组合体并不会立即输出这个流。相反,它将保持等待状态直到将要输出的东西达到一定的量。  

  假设输入以下指令:   
[java] view plain copy
 
 print?
  1. System.out.println("Debugging Info.");    

  JVM可能同意输出;然而,操作系统可能决定暂不输出。  
  由于这个原因,在调试程序时想要发现出错的位置就有可能成为问题。考虑以下的程序:     
[java] view plain copy
 
 print?
  1. for(int   i=0;   i<56;   i++)   {    
  2.   System.out.println(i);    
  3.   ...   //   containing   an   error    
  4.   }   

  错误可能出现在i等于54时,但是可能JVM在i等于49时就结束输出了。50到54仍然存在于缓存中,结果也就丢失了。  
   
  使用System.err来报告错误、调试程序就可以避免这种情况出现,它将使每一次操作的结果都输出出来。例如以下程序:     
[java] view plain copy
 
 print?
  1. for(int   i=0;   i<56;   i++)   {    
  2. System.err.println(i);    
  3. ...   //   containing   an   error    
  4. }    

  在每一次i等于54时都将显示错误信息。
3、System.out.println可能会被缓冲,而System.err.println不会
4、System.err和System.out就是错误输出和标准输出,如果你用LOG4J记录日志的话,且设定错误等级的话,System.err的输出是将记录到日志中。
5、输出设备是一样的,所以你看到的是一样的    
  System.setErr()   System.setOut()   是重定向两个流的方法。  
  以下为Sun   JDK1.5中文文档中的   可能有点泛泛了  
  ------------------------------  
  System.err  
  “标准”错误输出流。此流已打开并准备接受输出数据。  
   
  通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。按照惯例,此输出流用于显示错误消息,或者显示那些即使用户输出流(变量out的值)已经重定向到通常不被连续监视的某一文件或其他目标,也应该立刻引起用户注意的其他信息。    
   
  System.out  
  “标准”输出流。此流已打开并准备接受输出数据。通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。

6、System.err.println()是不缓冲的,所以优先级会高点,而System.out.println()是需要缓冲的,所以优先级会低点.

如下代码:

[java] view plain copy
 
 print?
  1. public class TestCodeSeg  
  2. {  
  3.     static  
  4.     {  
  5.         System.out.println("1");  
  6.     }  
  7.     {  
  8.         System.out.println("2");  
  9.     }  
  10.     public TestCodeSeg()  
  11.     {  
  12.         System.err.println("3");  
  13.     }  
  14.     public static void main(String[] args)  
  15.     {  
  16.         new TestCodeSeg();  
  17.     }  
  18. }  
输出结果可能为:
[java] view plain copy
 
 print?
  1. 1  
  2. 2  
  3. 3  
也可能为:
[java] view plain copy
 
 print?
  1. 1  
  2. 3  
  3. 2  
也可能为:
[java] view plain copy
 
 print?
  1. 3  
  2. 1  
  3. 2  
出现上面这种情况,原因就在于err是没有缓冲的,所以“3”的输出是随机的。

转载自:http://blog.sina.com.cn/s/blog_b4bfd3050101bmbk.html