zoukankan      html  css  js  c++  java
  • 【转】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

    博客地址迁移,博客目前更新在 csdn: https://blog.csdn.net/H_Rhui
  • 相关阅读:
    最大后验估计(MAP)
    mysql启动问题access denied for user 'root'@'localhost'(using password:YES)
    Median of Two Sorted Arrays-----LeetCode
    Two Sum-----LeetCode
    动态资源不缓存 filter
    过滤器 filter
    分页
    aop动态代理 事务 threadlocal
    ThreadLocal 开启事务
    数据库 元数据
  • 原文地址:https://www.cnblogs.com/hui-run/p/6605310.html
Copyright © 2011-2022 走看看