JDK1.8源码学习--lang包(System)

前言

 
月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂)

央是一片海洋,海乃百川,代表着一块海绵(吸纳万物)

泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出)

月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容

希望大家一起坚持这个过程,也同样希望大家最终都能从零到零,把知识从薄变厚,再由厚变薄!
 

一.System的作用:

         直接看源码注释(我的翻译可能不太准,如果道友们有更棒的理解,可以留言或者私信)

/**
 * The <code>System</code> class contains several useful class fields
 * and methods. It cannot be instantiated.
 * 1.System 类包含几个有用的类字段和方法。它不能被实例化。
 * <p>Among the facilities provided by the <code>System</code> class
 * are standard input, standard output, and error output streams;
 * access to externally defined properties and environment
 * variables; a means of loading files and libraries; and a utility
 * method for quickly copying a portion of an array.
 * 2.System类提供的工具包括标准输入、标准输出和错误输出流;访问外部定义的属性和环境变量;
 * 一种加载文件和库的方法;以及一种用于快速复制数组一部分的实用方法
 * @author  unascribed
 * @since   JDK1.0
 */

  二.成员变量: 

    private static String lineSeparator;

   /**
     * System properties. The following properties are guaranteed to be defined:
     * 系统属性。
     * <dl>
     * <dt>java.version         <dd>Java version number Java版本号
     * <dt>java.vendor          <dd>Java vendor specific string Java 供应商特定字符串
     * <dt>java.vendor.url      <dd>Java vendor URL Java 供应商 URL
     * <dt>java.home            <dd>Java installation directory Java安装目录
     * <dt>java.class.version   <dd>Java class version number Java 类版本号
     * <dt>java.class.path      <dd>Java classpath Java 类路径
     * <dt>os.name              <dd>Operating System Name 操作系统名称
     * <dt>os.arch              <dd>Operating System Architecture 操作系统架构
     * <dt>os.version           <dd>Operating System Version 操作系统版本
     * <dt>file.separator       <dd>File separator ("/" on Unix)
     * <dt>path.separator       <dd>Path separator (":" on Unix)
     * <dt>line.separator       <dd>Line separator ("\n" on Unix)
     * <dt>user.name            <dd>User account name 用户帐号名称
     * <dt>user.home            <dd>User home directory 用户主目录
     * <dt>user.dir             <dd>User's current working directory 用户当前工作目
     * </dl>
     */

    private static Properties props;

    private static volatile Console cons = null;

    /**
     * “标准”输入流。此流已打开并准备好提供输入数据。通常,此流对应于键盘输入或主机环境或用户指定的另一个输入源。
     */
    public final static InputStream in = null;

    /**
     * 1.“标准”输出流。此流已打开并准备好接受输出数据。通常,此流对应于主机环境或用户指定的显示输出或另一个输出目的地
     * 2.对于简单的独立 Java 应用程序,写入一行输出数据的典型方式是:
     * System.out.println(data) 参见println类 PrintStream中的方法。
     */
    public final static PrintStream out = null;

    /**
     * 1.“标准”错误输出流。此流已打开并准备好接受输出数据
     * 2.通常,此流对应于主机环境或用户指定的显示输出或另一个输出目的地。
     * 按照惯例,此输出流用于显示错误消息或其他应引起用户立即注意的信息,
     * 即使主要输出流(变量 out的值已重定向到文件或其他通常不会被持续监控的目标。
     */
    public final static PrintStream err = null;

    /* The security manager for the system.
    系统的安全管理器
     */
    private static volatile SecurityManager security = null;

三.构造方法: 

                不允许被实例

 /** Don't let anyone instantiate this class */
    //不要让任何人实例化这个类
    private System() {
    }

                重新分配流

    /**
     * 1.重新分配“标准”输入流。
     * 2.首先,如果有一个安全管理器,它的checkPermission方法被调用,
     * 并带有RuntimePermission("setIO")权限,看看是否可以重新分配“标准”输入流
     */
    public static void setIn(InputStream in) {
        checkIO();
        setIn0(in);
    }

    /**
     * 1.重新分配“标准”输出流。
     * 2.>首先,如果有一个安全管理器,它的checkPermission方法被调用,
     * 并带有RuntimePermission("setIO")权限,看看是否可以重新分配“标准”输出流。
     */
    public static void setOut(PrintStream out) {
        checkIO();
        setOut0(out);
    }

    /**
     * 1.重新分配“标准”错误输出流。
     *2.>首先,如果有安全管理器,它的checkPermission方法被调用,并带有RuntimePermission("setIO")权限,
     * 看是否可以重新分配“标准”错误输出流.
     */
    public static void setErr(PrintStream err) {
        checkIO();
        setErr0(err);
    }

                console

    /**
     * 1.返回与当前 Java 虚拟机关联的唯一 java.io.Console 对象(如果有)
 
     */
     public static Console console() {
         if (cons == null) {
             synchronized (System.class) {
                 cons = sun.misc.SharedSecrets.getJavaIOAccess().console();
             }
         }
         return cons;
     }

                inheritedChannel

    /**
     * 1.返回从创建此 Java 虚拟机的实体继承的通道
     * 2.该方法返回通过调用系统范围默认java.nio.channels.spi.SelectorProvider对象的
     * 3.除了 java.nio.channels.spi.SelectorProvider.inheritedChannel中描述的面向网络的通道外,
     * 该方法未来可能会返回其他类型的通道
     */
    public static Channel inheritedChannel() throws IOException {
        return SelectorProvider.provider().inheritedChannel();
    }

                getSecurityManager

    /**
     * 获取系统安全接口。
     */
    public static SecurityManager getSecurityManager() {
        return security;
    }

                getProperties

    /**
     * 1.确定当前系统属性
     * 2.首先,如果有一个安全管理器,它的 checkPropertiesAccess方法被调用而没有参数。这可能会导致安全异常。
     * <p>
     * 3.getProperty(String)方法使用的当前系统属性集作为Properties对象返回。如果当前没有一组系统属性,
     * 则首先创建并初始化一组系统属性。

     * 4.系统属性值中的多个路径由平台的路径分隔符分隔

     * 5.请注意,即使安全管理器不允许getProperties操作,它也可以选择允许getProperty(String)操作。
     */
    public static Properties getProperties() {
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPropertiesAccess();
        }

        return props;
    }

                lineSeparator

    /**
     * 1.返回系统相关的行分隔符字符串。它总是返回相同的值 - getProperty(String) 系统属性line.separator的初始值
     * 2.在 UNIX 系统上,它返回"\n";在 Microsoft Windows 系统上,它返回"\r\n"

     */
    public static String lineSeparator() {
        return lineSeparator;
    }

                setProperties

    /**
     * 1.将系统属性设置为Properties参数
     * 2.首先,如果有一个安全管理器,它的checkPropertiesAccess方法被调用而没有参数。这可能会导致安全异常
     * 3.该参数成为getProperty(String)方法使用的当前系统属性集。如果参数为null,则当前的系统属性集将被遗忘
     */
    public static void setProperties(Properties props) {
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPropertiesAccess();
        }
        if (props == null) {
            props = new Properties();
            initProperties(props);
        }
        System.props = props;
    }

                getProperty

    /**
     * 1.获取由指定键指示的系统属性
     * 2.首先,如果有一个安全管理器,它的checkPropertyAccess方法将被调用,
     * 并将密钥作为它的参数。这可能会导致 SecurityException。

     * 3.如果当前没有一组系统属性,则首先以与getProperties方法相同的方式创建和初始化一组系统属性。
     */
    public static String getProperty(String key) {
        checkKey(key);
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPropertyAccess(key);
        }

        return props.getProperty(key);
    }

    /**
     * 1.获取由指定键指示的系统属性
     * 2.首先,如果有一个安全管理器,它的checkPropertyAccess方法被调用,并使用key作为它的参数。
     * 3.如果当前没有一组系统属性,则首先以与getProperties方法相同的方式创建和初始化一组系统属性。
     */
    public static String getProperty(String key, String def) {
        checkKey(key);
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPropertyAccess(key);
        }

        return props.getProperty(key, def);
    }

                     setProperty

    /**

     * 1.设置由指定键指示的系统属性

     * 2.首先,如果存在安全管理器,则使用PropertyPermission(key, "write")权限调用其 
     * SecurityManager.checkPermission方法。这可能会导致抛出 SecurityException。
     * 如果没有抛出异常,则将指定的属性设置为给定的值

     */
    public static String setProperty(String key, String value) {
        checkKey(key);
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new PropertyPermission(key,
                SecurityConstants.PROPERTY_WRITE_ACTION));
        }

        return (String) props.setProperty(key, value);
    }

                   clearProperty

   /**
     * 1.删除由指定键指示的系统属性
     * 2.首先,如果存在安全管理器,则使用 PropertyPermission(key, "write")
     * 权限调用其SecurityManager.checkPermission方法。这可能会导致抛出 SecurityException。
     * 如果没有抛出异常,则删除指定的属性
     */
    public static String clearProperty(String key) {
        checkKey(key);
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new PropertyPermission(key, "write"));
        }

        return (String) props.remove(key);
    }

                getenv

    /**

     * 1.获取指定环境变量的值。环境变量是依赖于系统的外部命名值。

     * 2.如果存在安全管理器,则使用 RuntimePermission("getenv."+name)权限调用其 
     *  SecurityManager.checkPermission方法。这可能会导致抛出 SecurityException。
     *  如果没有抛出异常,则返回变量 name的值。

     * 3.<a name="EnvironmentVSSystemProperties">系统属性和环境变量都是名称和值之间的概念映射。
     * 这两种机制都可用于将用户定义的信息传递给 Java 进程。环境变量具有更全局的影响,
     * 因为它们对定义它们的进程的所有后代可见,而不仅仅是直接的 Java 子进程。
     * 它们在不同的操作系统上可以有细微的不同语义,例如不区分大小写。
     * 由于这些原因,环境变量更有可能产生意想不到的副作用。
     * 最好尽可能使用系统属性。当需要全局效果时,或当外部系统接口需要环境变量(例如PATH)时,
     * 应使用环境变量

     * 4.在 UNIX 系统上,name的字母大小写通常很重要,而在 Microsoft Windows 系统上通常不重要。
     * 例如,表达式 System.getenv("FOO").equals(System.getenv("foo"))
     * 在 Microsoft Windows 上很可能为真

     */
    public static String getenv(String name) {
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new RuntimePermission("getenv."+name));
        }

        return ProcessEnvironment.getenv(name);
    }

    /**
     * 1.返回当前系统环境的不可修改的字符串映射视图。环境是从名称到从父进程传递到子进程的值的依赖于系统的映射。

     * 2.如果系统不支持环境变量,则返回一个空映射

     * 3.返回的映射永远不会包含空键或值。尝试查询空键或值是否存在将抛出NullPointerException。
     * 尝试查询不是  String类型的键或值的存在将抛出ClassCastException。

     * 4.返回的地图及其集合视图可能不遵守Object.equals 和 Object.hashCode方法的一般约定。

     * 5.返回的地图在所有平台上通常区分大小写

     * 6.如果存在安全管理器,则使用 RuntimePermission("getenv.")权限调用其 

     * 7.将信息传递给 Java 子进程时,<a href=EnvironmentVSSystemProperties>系统属性通常比环境变量更受欢迎

     */
    public static java.util.Map<String,String> getenv() {
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new RuntimePermission("getenv.*"));
        }

        return ProcessEnvironment.getenv();
    }

               exit

/
     * 1.终止当前运行的 Java 虚拟机。参数用作状态码;按照惯例,非零状态代码表示异常终止

     * 2.此方法调用 Runtime类中的exit 方法。此方法永远不会正常返回
     */
    public static void exit(int status) {
        Runtime.getRuntime().exit(status);
    }

                 gc

    /**

    * 1.运行垃圾收集器。
     * 2.调用gc方法表明 Java 虚拟机花费精力来回收未使用的对象,以使它们当前占用的内存可用于快速重用。
     * 当控制从方法调用返回时,Java 虚拟机已尽最大努力从所有丢弃的对象中回收空间

     */
    public static void gc() {
        Runtime.getRuntime().gc();
    }

                runFinalization

    /**
     * 1.运行任何挂起终结的对象的终结方法
     * 2.调用此方法表明 Java 虚拟机花费精力来运行已发现被丢弃但其 finalize方法尚未运行的对象的 finalize方法。
     * 当控制权从方法调用返回时,Java 虚拟机已尽最大努力完成所有未完成的终结。
     * 3.调用System.runFinalization()等效于调用: Runtime.getRuntime().runFinalization()

     */
    public static void runFinalization() {
        Runtime.getRuntime().runFinalization();
    }

    /**
     * 1.退出时启用或禁用终结;这样做指定所有具有尚未自动调用的终结器的对象的终结器
     * 将在 Java 运行时退出之前运行。默认情况下,退出时的终结是禁用的。
     * 2.如果存在安全管理器,则首先调用其checkExit方法,
     * 并使用 0 作为其参数以确保允许退出。这可能会导致 SecurityException
     */
    @Deprecated
    public static void runFinalizersOnExit(boolean value) {
        Runtime.runFinalizersOnExit(value);
    }

                load

    /**

     * 1.加载由文件名参数指定的本机库。文件名参数必须是绝对路径名。
     * 2.如果 filename 参数在去除任何特定于平台的库前缀、路径和文件扩展名后表示名称为 L 的库,
     * 并且名为 L 的本机库与 VM 静态链接,则 JNI_OnLoad_L 函数由库导出被调用而不是尝试加载动态库。
     * 文件系统中不必存在与参数匹配的文件名。
     * 3.有关更多详细信息,请参阅 JNI 规范。
     * 4.否则,文件名参数将以依赖于实现的方式映射到本机库映像
     * 5.调用System.load(name)等效于调用: Runtime.getRuntime().load(name)
     */
    @CallerSensitive
    public static void load(String filename) {
        Runtime.getRuntime().load0(Reflection.getCallerClass(), filename);
    }

    /**
     * 1.加载由 libname参数指定的本机库。libname参数不得包含任何特定于平台的前缀、文件扩展名或路径。
     * 如果名为libname的本机库与 VM 静态链接,则调用该库导出的 JNI_OnLoad_libname函数。
     * 有关更多详细信息,请参阅 JNI 规范。

     * 2.否则,libname 参数将从系统库位置加载并以依赖于实现的方式映射到本机库映像

     * 3.调用 System.loadLibrary(name)等效于调用Runtime.getRuntime().loadLibrary(name)

     */
    @CallerSensitive
    public static void loadLibrary(String libname) {
        Runtime.getRuntime().loadLibrary0(Reflection.getCallerClass(), libname);
    }

                newPrintStream

    /**
     * 根据编码为 stdout/err 创建 PrintStream。
     */
    private static PrintStream newPrintStream(FileOutputStream fos, String enc) {
       if (enc != null) {
            try {
                return new PrintStream(new BufferedOutputStream(fos, 128), true, enc);
            } catch (UnsupportedEncodingException uee) {}
        }
        return new PrintStream(new BufferedOutputStream(fos, 128), true);
    }

六.总结:        

        System类中还是有很多值得学习的地方.        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值