同时使用了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和操作系统共同决定何时输出这个流。也就是说,尽管开发者键入了:

  1. System.out.print("Test Output:");

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

假设输入以下指令:

  1. System.out.println("Debugging Info.");

JVM可能同意输出;然而,操作系统可能决定暂不输出。  
  由于这个原因,在调试程序时想要发现出错的位置就有可能成为问题。考虑以下的程序:

  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来报告错误、调试程序就可以避免这种情况出现,它将使每一次操作的结果都输出出来。例如以下程序:

  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()是需要缓冲的,所以优先级会低点.

如下代码:

  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. }

输出结果可能为:

  1. 1
  2. 2
  3. 3

也可能为:

  1. 1
  2. 3
  3. 2

也可能为:

  1. 3
  2. 1
  3. 2

出现上面这种情况,原因就在于err是没有缓冲的,所以“3”的输出是随机的。

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

最新文章

  1. 转,Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数
  2. XUnit学习
  3. Could not write metadata for &#39;/taiping-sol-insu-composite&#39;.
  4. apk反编译生成程序的源代码和图片、XML配置、语言资源等文件
  5. 基于51,人体红外感应和RC522的门禁系统
  6. MYSQL基础笔记(七)- 数据类型二
  7. sqliteExpert软件使用(创建数据库和表)
  8. Html笔记(五)表格
  9. 如何使用SublimeText风格的代码高亮样式 添加Zed Coding(EMMET)插件
  10. Codeforces 549G. Happy Line 馋
  11. Java IO学习笔记六
  12. C#与Oracle数据库
  13. 蓝鲸 CTF web——密码泄露
  14. 毕业设计——Django邮件发送功能实现及问题记录
  15. SQL 获取表结构
  16. sql-connectionStrings
  17. linq left join ,inner join ,crossjoin
  18. 微信小程序图片宽100%显示并且不变形
  19. jmeter+ant+jenkins+mac 报告优化(三) 使用命令行执行jmeter方式生成多维度的图形化HTML报告
  20. 深入了解Linux(一)

热门文章

  1. ipmitool获取服务器信息
  2. Elasticsearch snapshot 备份的使用方法 【备忘】
  3. Vs2017获取Git空仓库后创建解决方案及项目无法推送,推送失败的问题.
  4. alpha冲刺1/10
  5. Apache Pulsar——企业级消息订阅系统介绍
  6. TopCoder SRM500 Div1 500 分治
  7. JS获取验证码后倒计时不受刷新及关闭影响
  8. 【JavaScript】快速入门
  9. 在ArchLinux中安装MySQL
  10. 一道有意思的找规律题目 --- CodeForces - 964A