前言
月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂)
央是一片海洋,海乃百川,代表着一块海绵(吸纳万物)
泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出)
月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容
希望大家一起坚持这个过程,也同样希望大家最终都能从零到零,把知识从薄变厚,再由厚变薄!
一.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);
}