点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

来源:    1t.click/k87

  • 什么是System.out.println()

  • UML图

  • 输出重定向——改变输出路径

  • System.out.println性能分析

  • System.out.println VS 日志记录组件(Log4j等)

  • 静态导入来缩短System.out.println

  • System.err和System.in


什么是System.out.println()

System.out.println是一个Java语句,一般情况下是将传递的参数,打印到控制台。

System:是 java.lang包中的一个final类。根据javadoc,“java.lang.System该类提供的设施包括标准输入,标准输出和错误输出流; 访问外部定义的属性和环境变量; 一种加载文件和库的方法; 以及用于快速复制数组等一部分的实用方法... ”

out:是System类的静态成员字段,类型为PrintStream。

public static final PrintStream out

他在启动时就会被实例化,并与主机的标准输出控制台进行映射。该流在实例化之后立即打开,并准备接受数据。

println:是PrintStream类的一个方法。println打印(参数内容+换行符) 到控制台。

PrintStream类中有多个重载的println方法。每个println是通过调用print方法并添加一个换行符实现的。print方法是通过调用write方法实现的。

System.out.println() 结构图如下:

以下是JDK源中System.out.println的骨架结构,和代码片段。

UML图

部分代码段:

public final class System {static PrintStream out;static PrintStream err;static InputStream in;...
}public class PrintStream extends FilterOutputStream {//out object is inherited from FilterOutputStream classpublic void println() {...
}

输出重定向——改变输出路径

out对象可以自定义的。在启动时由java运行时环境初始化,并且可以在执行期间由开发人员更改。代替在默认情况下的标准输出。当您通过命令行运行程序时,输出将打印在同一个命令窗口中。我们可以使用setOut方法来改变这种行为。在以下示例中,我将输出重定向到同一目录中的文本文件。

public class ChangeOut {public static void main(String args[]) {try {System.setOut(new PrintStream(new FileOutputStream("log.txt")));System.out.println("Now the output is redirected!");} catch(Exception e) {}}
}

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 static java.lang.System.out;public class ShortSOP {public static void main(String[] args) {out.println("Hello, world");}
}

不静态导入的话直接写out.println会提示编译错误的。

System.err和System.in

作为相关部分,接下来介绍一下“err”和“in”。'in'与InputStream相关联。与“out”相对,“in”用于从标准控制台通用键盘获取输入。

'err'与PrintStream相关联,并将参数打印到标准错误输出流。当您使用eclipse等的IDE时,可以看到“out”和“err”之间的输出差异。

import java.io.*;/*** Created by zjl on 2017/9/16.*/
public class InOutErr {public static void main(String args[]) {try {System.out.println("请输入一段话");BufferedReader reader = new BufferedReader(new InputStreamReader(System.in ));String filename = reader.readLine();InputStream input = new FileInputStream(filename);System.out.println("File opened...");} catch (IOException e){System.err.println("Where is that file?");}}
}
热门内容:程序员接私活完整攻略+赠开源管理系统
Docker 部署SpringBoot项目不香吗?为什么 Java 中“1000==1000”为false,而”100==100“为true?
面试官问我:如何设计 QQ、微信等第三方账号登陆 ?还要我说出数据库表设计!
为什么MySQL不推荐使用uuid或者雪花id作为主键?最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)

深入研究 System.out.println()相关推荐

  1. 绝大多数程序员没有这么深入研究过System.out.println()!

    点击上方"朱小厮的博客",选择"设为星标" 回复"1024"获取独家整理的学习资料 来源:http://1t.click/k87 什么是Sy ...

  2. Java中的System.out.println到底是什么,而且Java源码中System.java的out是null,为什么可以调用println方法?

    在我们接触Java第一个程序时,我们使用了public class和public static void main(String[]) args)以及System.out.println(" ...

  3. Java中的系统类–属性,System.out.println()

    System class in java is one of the core classes and I have never seen any java developer who doesn't ...

  4. Java的System.out.println()深入解析理解

    在Java程序(特别是控制台)中常用System.out.println()语句来输出信息,从开始学习Java就知道用它来输出Hello World,没有深究其实现原理,现在查阅文档.源代码后记录一下 ...

  5. Java基础学习之用System.out.println()输出中文字符串乱码问题

    问题描述: 在学习"java基本数据类型"相关知识点过程中,使用不同文本编辑器编写java源代码文件在cmd控制台中编译和运行过程中多次出现乱码情况. 电脑操作系统:win10 企 ...

  6. java println()中_java中system.out.println()是什么意思

    在Java编程中,我们常常用System.out.println()方法来输出字符串,也许我们都已经猜到println()是方法名,但System是什么,out又是什么呢? 这里就涉及用到一个stat ...

  7. 求求你别再用 System.out.println 了!!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:my.oschina.net/yuchener/bl ...

  8. 最重要的事情 一 、消息通信机制(1)ant 打包方法(2) system.out.println()用法 二、UML学习

    最重要的事情    一 .消息通信机制(1)ant 打包方法(2) system.out.println()用法      二.UML学习

  9. 居然还有人在用 System.out.println打日志的吗?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 雨尔辰辰 来源 | my.oschina.ne ...

最新文章

  1. 推荐两个插件DPack, Resharper
  2. 教学感悟 计算机教学,计算机教学心得体会-20210715101406.doc-原创力文档
  3. linux generic什么意思_如何在 Ubuntu Linux 上释放 /boot 分区的空间? | Linux 中国
  4. 游戏行业的人工智能设计(二):路径搜寻和感知
  5. IOS中将对象属性列表归档成一个plist文件中
  6. 微信小程序 小程序登陆功能
  7. linux服务器查配置信息失败,查看Linux服务器的配置信息
  8. 最速下降法matlab全局最小值_梯度下降概念
  9. Hadoop Balancer运行速度优化
  10. mybatis xml标签,批量插入
  11. php secket5,《Thinkphp5使用Socket服务》 入门篇
  12. ThinkJS框架入门详细教程(二)新手入门项目
  13. Audio之音频帧周期(四十三)
  14. JAVA的对象创建与调用的内存解析
  15. android 截图root权限,为什么 Android 截屏需要 root 权限
  16. 腾讯云域名购买和域名解析教程
  17. 十二个“一”---十二位胜似亲人的悲情向团体详解
  18. 屌炸天的SpringBoot2 +WxJava 整合微信
  19. 摄像机成像原理(模型)与标定
  20. 【云和恩墨大讲堂】尹涛 - 由DRM引起的ORA-00481错误

热门文章

  1. 问题二:相关性怎么引入?
  2. PAT Basic 1072
  3. 数据结构Java版之红黑树(八)
  4. pyqt5 使用 QTimer, QThread, pyqtSignal 实现自动执行,多线程,自定义信号触发。
  5. iOS 后台挂起的一些坑
  6. 在Windows上搭建Git Server
  7. Codeforces 504 A (Round #285 div.1 A) Misha and Forest
  8. Java编写的电梯模拟系统《结对作业》
  9. git phpstorm 配置
  10. jquery radio 取值