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() 结构图如下:

部分代码段:

public final class System {
    static PrintStream out;
    static PrintStream err;
    static InputStream in;
    ...
}

public class PrintStream extends FilterOutputStream {
    //out object is inherited from FilterOutputStream class
    public void 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

有时我们觉得System.out.println是一个很长的语句要打印。静态导入可能会缩短一点,但不推荐使用,因为它导致可读性差。我只是使用这种情况来解释静态导入,并避免在下面的情况下使用它。

import static java.lang.System.out;

public class ShortSOP {
  public static void main(String[] args) {
    out.println("Hello, world");
  }
}

不静态导入的话直接写out.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) {}
  }
}

原文地址:https://www.cnblogs.com/frank223/p/11830248.html

时间: 2024-11-09 21:10:50

System.out.println()相关源码的相关文章

Cocos2d-X3.0 刨根问底(八)----- 场景(Scene)、层(Layer)相关源码分析

本章节我们重点分析Cocos2d-x3.0与 场景.层相关的源码.这部分源码集中在 libcocos2d –> layers_scenes_transitions_nodes目录下面 我先发个截图大家了解一下都有哪些文件.红色框里面的就是我们今天要分析的文件. 从命名上可以了解,这个文件夹里的文件主要包含了  场景,层,变换这三种类型的文件. 下面我们先分析Scene类 打开CCScene.h文件 /** @brief Scene is a subclass of Node that is us

ThreadPoolExecutor的应用和实现分析(中)—— 任务处理相关源码分析

转自:http://www.tuicool.com/articles/rmqYjq 前面一篇文章从Executors中的工厂方法入手,已经对ThreadPoolExecutor的构造和使用做了一些整理.而这篇文章,我们将接着前面的介绍, 从源码实现上对ThreadPoolExecutor在任务的提交.执行,线程重用和线程数维护等方面做下分析. 0.    ThreadPoolExecutor类的声明属性变量分析 public class ThreadPoolExecutor extends Ab

Android Touch事件相关源码【Android SourceCode 2.3.6】

2018-05-31 17:23:46 Note: 这里的源码来自Android 2.3.6,这个版本的代码比较简单,适合理解Touch事件的传递原理.后续版本源码复杂了很多,但是原理都是类似的. 2个方法源码较多,在这里记录下. View.java 1 /** 2 * Implement this method to handle touch screen motion events. 3 * 4 * @param event The motion event. 5 * @return Tru

ThreadingTCPServer相关源码和RequestHandler相关源码

BaseServer 源码: class BaseServer:     """Base class for server classes.     Methods for the caller:     - __init__(server_address, RequestHandlerClass)     - serve_forever(poll_interval=0.5)     - shutdown()     - handle_request()  # if you 

如何把hadoop相关源码关联到eclipse工程中

在eclipse中阅读源码非常方便,利于我们平时的学习,如下就供述如何把hadoop源码导入到eclpse的java工程中的 一:解压源码 首先,我们在windows下使用winrar把hadoop-1.1.2.tar.gz解压,如图1所示 我们关注文件夹src,浏览该文件夹,如图2所示 我们需要这三个文件夹,一会我们会把这三个文件夹复制到eclipse中. 二:创建java工程 在eclipse中通过菜单栏创建一个java工程,如图3, 图3 这里创建工程叫做"HadoopShanghai&q

气象数据集数据和相关源码

http://www.dataguru.cn/thread-260221-1-1.html 今天看了很多帖子,对气象数据集的数据下载都不是很清晰,我特地整理了一个. 老师提供的ftp://ftp3.ncdc.noaa.gov/pub/data/noaa已经转到ftp://ftp.ncdc.noaa.gov/pub/data/noaa了,具体见下: 2 下载气象数据集部分数据,写一个Map-Reduce作业,求每年的最低温度,部署并运行之,抓图过程 ************************

看板娘相关源码介绍

做个记录,看到好玩的东西,看板娘如下: 下面的源码主要来自博客:https://www.cnblogs.com/zjfjava/p/9100898.html 是自己扣下来的,做了点调整,如果添加到你自己的博客没有效果可能是js冲突等,自己解决. <style> .lktest { left: 0px !important; } </style> <script src="https://cdn.jsdelivr.net/npm/[email protected]/l

liteos相关源码资料

源码:https://github.com/search?utf8=%E2%9C%93&q=liteos&type= 社区:https://www.iotclub.net/ 原文地址:https://www.cnblogs.com/still-smile/p/12169785.html

【第六篇】Volley代码修改之图片二级缓存以及相关源码阅读(重现ImageLoader.ImageCache)

前面http://www.cnblogs.com/androidsuperman/p/8a157b18ede85caa61ca5bc04bba43d0.html 有讲到使用LRU来处理缓存的,但是只是处理内存里面的缓存,没进行文件缓存和处理,那么如何实现Volley在本地的缓存呢 一般硬盘缓存使用com.jakewharton.disklrucache.DiskLruCache这个Lru缓存,具体代码在 https://github.com/JakeWharton/DiskLruCache/tr