![055279c010038d0ebff8567639b3ff7d.png](https://i-blog.csdnimg.cn/blog_migrate/f493c15416124c59a3ddbd20c8f2a7be.jpeg)
译者:为了美好的明天 来源: http:// 1t.click/k87
# 什么是System.out.println()
System.out.println是一个Java语句,一般情况下是将传递的参数,打印到控制台。
System:是 java.lang包中的一个final类。根据javadoc,“java.lang.System该类提供的设施包括标准输入,标准输出和错误输出流; 访问外部定义的属性和环境变量; 一种加载文件和库的方法; 以及用于快速复制数组等一部分的实用方法... ”
out:是System类的静态成员字段,类型为PrintStream。
public
他在启动时就会被实例化,并与主机的标准输出控制台进行映射。该流在实例化之后立即打开,并准备接受数据。
println:是PrintStream类的一个方法。println打印(参数内容+换行符) 到控制台。
PrintStream类中有多个重载的println方法。每个println是通过调用print方法并添加一个换行符实现的。print方法是通过调用write方法实现的。
System.out.println() 结构图如下:
![3616bae7d9df1fe767f22708eb4d491d.png](https://i-blog.csdnimg.cn/blog_migrate/3147682f10b255c0c06b41eeba729200.png)
以下是JDK源中System.out.println的骨架结构,和代码片段。
# UML图
![5c8286f80713d6cc7a2fc3cfae687b67.png](https://i-blog.csdnimg.cn/blog_migrate/abcfda19d6db94b8108298ccaa38a3ce.png)
部分代码段:
public
# 输出重定向——改变输出路径
out对象可以自定义的。在启动时由java运行时环境初始化,并且可以在执行期间由开发人员更改。代替在默认情况下的标准输出。当您通过命令行运行程序时,输出将打印在同一个命令窗口中。我们可以使用setOut方法来改变这种行为。在以下示例中,我将输出重定向到同一目录中的文本文件。
public
# System.out.println性能分析
有一个普遍的观念需要大家知道——System.out.println性能并不好。当我们深入分析时,其调用顺序如下println - > print - > write()+ newLine()。这个顺序流是Sun / Oracle JDK的实现。write()和newLine()都包含一个synchronized块。同步有一点开销,但更多的是添加字符到缓冲区和打印的开销更大。
当我们运行性能分析时,运行多个System.out.println并记录时间,执行时间会按比例增加。当打印超过50个字符并打印超过50,000行时,性能下降。
当然这一切都取决于我们使用的场景。不过无论如何请勿使用System.out.println打印日志( logging)到stdout。
# System.out.println VS 日志记录组件(Log4j等)
Log4J具有多种记录级别。如果我们正在编写一个小程序,只是为了实验/学习目的那么使用 System.out.println 就很不错。但当我们开发生产质量软件时,我们应该注意到应该使用记录组件(log4j等),并且应该避免使用System.out.println。为什么?
- 灵活性:log4j的记录器提供了多种记录级别。我们可以相应地分隔日志信息。例如,X消息只能在PRODUCTION上打印,Y消息应打印在ERROR等上。
- 可重构性:log4j只需一个参数更改即可关闭所有日志记录。
- 可维护性:想象一下,如果我们有数百个System.out.println全部通过应用程序散落,那么在一段时间内将难以维护程序。
- 粒度:在应用程序中,每个类都可以有不同的记录器并相应地进行控制。
- 实用性:在System.out中限制重定向消息的选项,但是如果是记录器(like log4j),则可以提供多种选项。我们甚至可以创建自定义输出选项并将其重定向。
所以我们不应该使用System.out.println进行日志记录和调试(logging and debugging)
# 静态导入来缩短System.out.println
有时我们觉得System.out.println是一个很长的语句要打印。静态导入可能会缩短一点,但不推荐使用,因为它导致可读性差。我只是使用这种情况来解释静态导入,并避免在下面的情况下使用它。
import
不静态导入的话直接写out.println会提示编译错误的。
![6ecadc18c9b9556a356a1469be69fe58.png](https://i-blog.csdnimg.cn/blog_migrate/f88040310d7526de731ff37e7c2535f8.jpeg)
# System.err和http://System.in
作为相关部分,接下来介绍一下“err”和“in”。'in'与InputStream相关联。与“out”相对,“in”用于从标准控制台通用键盘获取输入。
'err'与PrintStream相关联,并将参数打印到标准错误输出流。当您使用eclipse等的IDE时,可以看到“out”和“err”之间的输出差异。
import
打印结果:
![43a065fa43dc656d43ddce0d3bf0167a.png](https://i-blog.csdnimg.cn/blog_migrate/f6cb1a0e2941648d10a3505525442522.jpeg)
JavaSE进阶视频教程:
Java基础、入门、精通、架构师全套资源shimo.im![18ec527a9338c1e0e1367fb138352844.png](https://i-blog.csdnimg.cn/blog_migrate/b483e4db9c21ab93231a04236e5bd6a3.png)
官方参考资料、帮助文档、开发工具and源码
![b431e9dd1e4f2ce441c1604337762fca.png](https://i-blog.csdnimg.cn/blog_migrate/ddb27b4cffc37336d19e9a99c9cead19.png)
video
![a7d42c0f6dfa2acf8db75271f7301539.png](https://i-blog.csdnimg.cn/blog_migrate/e758b51910f044f41f835cab4ebe154b.jpeg)
推荐阅读:
java钢铁侠-马克51号:细说 Java 主流日志工具库!(文末附Java零基础159集视频教程!)zhuanlan.zhihu.com![aef2d7ab0cab0b091861a2447f08792c.png](https://i-blog.csdnimg.cn/blog_migrate/948f34e2bb0c9a9683f57eaf4a08bafa.jpeg)