A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林林鸦 初级黑马   /  2014-3-20 20:35  /  1078 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 林林鸦 于 2014-3-22 22:22 编辑

看《Java编程思想》异常这一章的时候,书中写到,通过写入System.err将错误发送给标准错误流比把错误信息输送到System.out要好,因为System.out也许会被重新定向。
可是一帮情况下System.out和System.err的在控制台上的输出结果是一样的,那么什么情况下会被重新定向呢?

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

1 个回复

正序浏览
1、System.out.println   能重定向到别的输出流,这样的话你在屏幕上将看不到打印的东西了,   
  而System.err.println只能在屏幕上实现打印,即使你重定向了也一样。
System.setOut(new   PrintStream(new   FileOutputStream(new   File( "c:/test.txt "))));
            System.out.println( "haha ");
2、
当向控制台输出信息时,开发者有两个选择: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时都将显示错误信息。
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()是不需要缓冲的,所以优先级会低点.

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马