System
java.lang.Object
|—java.lang.System
public final class System
extends Object
System 类包含几个有用的类字段和方法。 它不能被实例化。
System 类提供的设施包括标准输入、标准输出和错误输出流; 访问外部定义的属性和环境变量; 一种加载文件和库的方法; 以及一种用于快速复制数组的一部分的实用方法。
字段摘要
修饰符和类型 | 字段 | 描述 |
---|---|---|
static PrintStream | err | “标准”错误输出流。 |
static InputStream | in | “标准”输入流。 |
static PrintStream | out | “标准”输出流。 |
方法总结
修饰符和类型 | 方法 | 描述 |
---|---|---|
static void | arraycopy(Object src, int srcPos, Object dest, int destPos, int length) | 将指定源数组中的数组从指定位置开始复制到目标数组的指定位置。 |
static String | clearProperty(String key) | 删除由指定键指示的系统属性。 |
static Console | console() | 返回与当前 Java 虚拟机关联的唯一 Console 对象(如果有)。 |
static long | currentTimeMillis() | 以毫秒为单位返回当前时间。 |
static void | exit(int status) | 终止当前运行的 Java 虚拟机。 |
static void | gc() | 运行垃圾收集器。 |
static MapString,String | getenv() | 返回当前系统环境的不可修改的字符串映射视图。 |
static String | getenv(String name) | 获取指定环境变量的值。 |
static Properties | getProperties() | 确定当前系统属性。 |
static String | getProperty(String key) | 获取指定键指示的系统属性。 |
static String | getProperty(String key, String def) | 获取指定键指示的系统属性。 |
static SecurityManager | getSecurityManager() | 获取系统安全接口。 |
static int | identityHashCode(Object x) | 为给定对象返回与默认方法 hashCode() 返回的相同的哈希码,无论给定对象的类是否覆盖 hashCode()。 |
static Channel | inheritedChannel() | 返回从创建此 Java 虚拟机的实体继承的通道。 |
static String | lineSeparator() | 返回系统相关的行分隔符字符串。 |
static void | load(String filename) | 加载由文件名参数指定的本机库。 |
static void | loadLibrary(String libname) | 加载由 libname 参数指定的本机库。 |
static String | mapLibraryName(String libname) | 将库名称映射到表示本机库的特定于平台的字符串。 |
static long | nanoTime() | 返回正在运行的 Java 虚拟机的高分辨率时间源的当前值,以纳秒为单位。 |
static void | runFinalization() | 运行任何等待终结的对象的终结方法。 |
static void | runFinalizersOnExit(boolean value) | 已弃用。 这种方法本质上是不安全的。 这可能会导致在其他线程同时操作这些对象时对活动对象调用终结器,从而导致行为不稳定或死锁。 |
static void | setErr(PrintStream err) | 重新分配“标准”错误输出流。 |
static void | setIn(InputStream in) | 重新分配“标准”输入流。 |
static void | setOut(PrintStream out) | 重新分配“标准”输出流。 |
static void | setProperties(Properties props) | 将系统属性设置为 Properties 参数。 |
static String | setProperty(String key, String value) | 设置由指定键指示的系统属性。 |
static void | setSecurityManager(SecurityManager s) | 设置系统安全。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
字段详细信息
err
public static final PrintStream err
“标准”错误输出流。 此流已经打开并准备好接受输出数据。
通常,此流对应于主机环境或用户指定的显示输出或另一个输出目的地。 按照惯例,此输出流用于显示错误消息或其他应立即引起用户注意的信息,即使主要输出流(变量 out 的值)已重定向到文件或其他目标 通常不会持续监控。
in
public static final InputStream in
“标准”输入流。 该流已经打开并准备好提供输入数据。 通常,此流对应于键盘输入或主机环境或用户指定的另一个输入源。
out
public static final PrintStream out
“标准”输出流。 此流已经打开并准备好接受输出数据。 通常,此流对应于主机环境或用户指定的显示输出或另一个输出目的地。
对于简单的独立 Java 应用程序,编写一行输出数据的典型方法是:
System.out.println(data)
方法详情
setIn
public static void setIn(InputStream in)
重新分配“标准”输入流。
首先,如果有安全管理器,则使用 RuntimePermission(“setIO”) 权限调用其 checkPermission 方法,以查看是否可以重新分配“标准”输入流。
参数:
参数名称 | 参数描述 |
---|---|
in | 新的标准输入流。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkPermission 方法不允许重新分配标准输入流。 |
setOut
public static void setOut(PrintStream out)
重新分配“标准”输出流。
首先,如果有安全管理器,则使用 RuntimePermission(“setIO”) 权限调用其 checkPermission 方法,以查看是否可以重新分配“标准”输出流。
参数:
参数名称 | 参数描述 |
---|---|
out | 新的标准输出流 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkPermission 方法不允许重新分配标准输出流。 |
setErr
public static void setErr(PrintStream err)
重新分配“标准”错误输出流。
首先,如果有一个安全管理器,它的 checkPermission 方法会以 RuntimePermission(“setIO”) 权限调用,以查看是否可以重新分配“标准”错误输出流。
参数:
参数名称 | 参数描述 |
---|---|
err | 新的标准错误输出流。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkPermission 方法不允许重新分配标准错误输出流。 |
console
public static Console console()
返回与当前 Java 虚拟机关联的唯一 Console 对象(如果有)。
返回:
系统控制台(如果有),否则为 null。
inheritedChannel
public static Channel inheritedChannel() throws IOException
返回从创建此 Java 虚拟机的实体继承的通道。
该方法返回调用系统范围默认 SelectorProvider 对象的inheritedChannel 方法获得的通道。
除了inheritedChannel中描述的面向网络的通道外,该方法将来可能会返回其他类型的通道。
返回:
继承的通道(如果有),否则为 null。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果发生 I/O 错误 |
SecurityException | 如果存在安全管理器并且它不允许访问通道。 |
setSecurityManager
public static void setSecurityManager(SecurityManager s)
设置系统安全。
如果已经安装了安全管理器,该方法首先调用安全管理器的 checkPermission 方法,并带有 RuntimePermission(“setSecurityManager”) 权限,以确保可以替换现有的安全管理器。 这可能会导致抛出 SecurityException。
否则,该参数被建立为当前的安全管理器。 如果参数为 null 并且没有建立安全管理器,则不采取任何操作,方法只是返回。
参数:
参数名称 | 参数描述 |
---|---|
s | 安全管理员。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果已经设置了安全管理器并且它的 checkPermission 方法不允许替换它。 |
getSecurityManager
public static SecurityManager getSecurityManager()
获取系统安全接口。
返回:
如果已经为当前应用程序建立了安全管理器,则返回该安全管理器; 否则,返回 null。
currentTimeMillis
public static long currentTimeMillis()
以毫秒为单位返回当前时间。 请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,并且可能更大。 例如,许多操作系统以几十毫秒为单位测量时间。
有关“计算机时间”和协调世界时 (UTC) 之间可能出现的细微差异的讨论,请参阅类 Date 的描述。
返回:
当前时间与 UTC 1970 年 1 月 1 日午夜之间的差异,以毫秒为单位。
nanoTime
public static long nanoTime()
返回正在运行的 Java 虚拟机的高分辨率时间源的当前值,以纳秒为单位。
此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意的原始时间以来的纳秒(可能在将来,因此值可能为负数)。在 Java 虚拟机实例中,此方法的所有调用都使用相同的来源;其他虚拟机实例可能使用不同的来源。
此方法提供纳秒精度,但不一定提供纳秒分辨率(即值更改的频率) – 不保证分辨率至少与 currentTimeMillis() 的分辨率一样好。
由于数值溢出,超过大约 292 年(263 纳秒)的连续调用的差异将无法正确计算经过的时间。
仅当在 Java 虚拟机的同一实例中获得的两个此类值之间的差异被计算时,此方法返回的值才有意义。
例如,要测量一些代码需要多长时间执行:
long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;
比较两个 nanoTime 值
long t0 = System.nanoTime();
...
long t1 = System.nanoTime();
应该使用 t1 – t0 < 0,而不是 t1 < t0,因为数值溢出的可能性。
返回:
正在运行的 Java 虚拟机的高分辨率时间源的当前值,以纳秒为单位
arraycopy
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
将指定源数组中的数组从指定位置开始复制到目标数组的指定位置。数组组件的子序列从 src 引用的源数组复制到 dest 引用的目标数组。复制的组件数量等于长度参数。源数组中位置 srcPos 到 srcPos+length-1 的分量分别复制到目标数组的位置 destPos 到 destPos+length-1。
如果 src 和 dest 参数引用同一个数组对象,则执行复制,就好像首先将位置 srcPos 到 srcPos+length-1 的分量复制到具有长度分量的临时数组,然后临时数组的内容是通过目标数组的 destPos+length-1 复制到位置 destPos。
如果 dest 为 null,则抛出 NullPointerException。
如果 src 为 null,则抛出 NullPointerException 并且不修改目标数组。
否则,如果以下任何一项为真,则抛出 ArrayStoreException 并且不修改目标:
- src 参数引用一个不是数组的对象。
- dest 参数引用一个不是数组的对象。
- src 参数和 dest 参数引用其组件类型为不同原始类型的数组。
- src 参数引用具有原始组件类型的数组,而 dest 参数引用具有引用组件类型的数组。
- src 参数引用具有引用组件类型的数组,而 dest 参数引用具有原始组件类型的数组。
否则,如果以下任何一项为真,则抛出 IndexOutOfBoundsException 并且不修改目标:
- srcPos 参数是否定的。
- destPos 参数是否定的。
- length 参数是否定的。
- srcPos+length 大于 src.length,即源数组的长度。
- destPos+length 大于 dest.length,即目标数组的长度。
否则,如果从位置 srcPos 到 srcPos+length-1 的源数组的任何实际组件不能通过赋值转换转换为目标数组的组件类型,则抛出 ArrayStoreException。 在这种情况下,设 k 为小于 length 的最小非负整数,使得 src[srcPos+k] 不能转换为目标数组的组件类型; 当抛出异常时,从位置 srcPos 到 srcPos+k-1 的源数组组件将已经被复制到目标数组位置 destPos 到 destPos+k-1,并且不会修改目标数组的其他位置。 (由于已经逐条列出了限制,本段仅适用于两个数组都具有引用类型的组件类型的情况。)
参数:
参数名称 | 参数描述 |
---|---|
src | 源数组。 |
srcPos | 源数组中的起始位置。 |
dest | 目标数组。 |
destPos | 目标数据中的起始位置。 |
length | 要复制的数组元素的数量。 |
Throws:
Throw名称 | Throw描述 |
---|---|
IndexOutOfBoundsException | 如果复制会导致访问数组边界之外的数据。 |
ArrayStoreException | 如果 src 数组中的元素由于类型不匹配而无法存储到 dest 数组中。 |
NullPointerException | 如果 src 或 dest 为空。 |
identityHashCode
public static int identityHashCode(Object x)
为给定对象返回与默认方法 hashCode() 返回的相同的哈希码,无论给定对象的类是否覆盖 hashCode()。 空引用的哈希码为零。
参数:
参数名称 | 参数描述 |
---|---|
x | 要为其计算 hashCode 的对象 |
返回:
hashCode
getProperties
public static Properties getProperties()
确定当前系统属性。
首先,如果有一个安全管理器,它的 checkPropertiesAccess 方法会被调用而不带任何参数。 这可能会导致安全异常。
getProperty(java.lang.String) 方法使用的当前系统属性集作为 Properties 对象返回。 如果没有当前的系统属性集,则首先创建并初始化一组系统属性。 这组系统属性始终包含以下键的值:
系统属性值中的多个路径由平台的路径分隔符分隔。
请注意,即使安全管理器不允许 getProperties 操作,它也可以选择允许 getProperty(java.lang.String) 操作。
返回:
系统属性
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkPropertiesAccess 方法不允许访问系统属性。 |
lineSeparator
public static String lineSeparator()
返回系统相关的行分隔符字符串。 它总是返回相同的值——系统属性 line.separator 的初始值。
在 UNIX 系统上,它返回 “\n”; 在 Microsoft Windows 系统上,它返回“\r\n”。
返回:
系统相关的行分隔符字符串
setProperties
public static void setProperties(Properties props)
将系统属性设置为 Properties 参数。
首先,如果有一个安全管理器,它的 checkPropertiesAccess 方法会被调用而不带任何参数。 这可能会导致安全异常。
该参数成为 getProperty(java.lang.String) 方法使用的当前系统属性集。 如果参数为空,则当前的系统属性集被遗忘。
参数:
参数名称 | 参数描述 |
---|---|
props | 新的系统属性。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkPropertiesAccess 方法不允许访问系统属性。 |
getProperty
public static String getProperty(String key)
获取指定键指示的系统属性。
首先,如果有一个安全管理器,它的 checkPropertyAccess 方法会以键作为参数调用。 这可能会导致 SecurityException。
如果没有当前的系统属性集,则首先以与 getProperties 方法相同的方式创建和初始化一组系统属性。
参数:
参数名称 | 参数描述 |
---|---|
key | 系统属性的名称。 |
返回:
系统属性的字符串值,如果没有具有该键的属性,则返回 null。
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果安全管理器存在并且其 checkPropertyAccess 方法不允许访问指定的系统属性。 |
NullPointerException | 如果键为null。 |
IllegalArgumentException | 如果键为empty。 |
getProperty
public static String getProperty(String key, String def)
获取指定键指示的系统属性。
首先,如果有一个安全管理器,它的 checkPropertyAccess 方法会以键作为参数调用。
如果没有当前的系统属性集,则首先以与 getProperties 方法相同的方式创建和初始化一组系统属性。
参数:
参数名称 | 参数描述 |
---|---|
key | 系统属性的名称。 |
def | 默认值。 |
返回:
系统属性的字符串值,如果没有具有该键的属性,则为默认值。
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果安全管理器存在并且其 checkPropertyAccess 方法不允许访问指定的系统属性。 |
NullPointerException | 如果键为null。 |
IllegalArgumentException | 如果键为empty。 |
setProperty
public static String setProperty(String key, String value)
设置由指定键指示的系统属性。
首先,如果存在安全管理器,则使用 PropertyPermission(key, “write”) 权限调用其 SecurityManager.checkPermission 方法。 这可能会导致抛出 SecurityException。 如果未引发异常,则将指定的属性设置为给定值。
参数:
参数名称 | 参数描述 |
---|---|
key | 系统属性的名称。 |
value | 系统属性的值。 |
返回:
系统属性的前一个值,如果没有,则返回 null。
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkPermission 方法不允许设置指定的属性。 |
NullPointerException | 如果键或值为null。 |
IllegalArgumentException | 如果键为empty。 |
clearProperty
public static String clearProperty(String key)
删除由指定键指示的系统属性。
首先,如果存在安全管理器,则使用 PropertyPermission(key, “write”) 权限调用其 SecurityManager.checkPermission 方法。 这可能会导致抛出 SecurityException。 如果没有抛出异常,则删除指定的属性。
参数:
参数名称 | 参数描述 |
---|---|
key | 要删除的系统属性的名称。 |
返回:
系统属性的前一个字符串值,如果没有具有该键的属性,则返回 null。
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果安全管理器存在并且其 checkPropertyAccess 方法不允许访问指定的系统属性。 |
NullPointerException | 如果键为null。 |
IllegalArgumentException | 如果键为empty。 |
getenv
public static String getenv(String name)
获取指定环境变量的值。环境变量是系统相关的外部命名值。
如果存在安全管理器,则使用 RuntimePermission(“getenv.”+name) 权限调用其 SecurityManager#checkPermission 方法。这可能会导致抛出 SecurityException。如果没有抛出异常,则返回变量名的值。
系统属性 和 环境变量在概念上都是名称和值之间的映射。这两种机制都可用于将用户定义的信息传递给 Java 进程。环境变量具有更全局的影响,因为它们对定义它们的进程的所有后代可见,而不仅仅是直接的 Java 子进程。在不同的操作系统上,它们可能具有细微的不同语义,例如不区分大小写。由于这些原因,环境变量更有可能产生意想不到的副作用。最好尽可能使用系统属性。当需要全局效果或外部系统接口需要环境变量(例如 PATH)时,应使用环境变量。
在 UNIX 系统上,名称的字母大小写通常很重要,而在 Microsoft Windows 系统上通常不重要。例如,表达式 System.getenv(“FOO”).equals(System.getenv(“foo”)) 在 Microsoft Windows 上可能为真。
参数:
参数名称 | 参数描述 |
---|---|
name | 环境变量的名称 |
返回:
变量的字符串值,如果变量未在系统环境中定义,则为 null
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果名称为null |
SecurityException | 如果存在安全管理器并且其 SecurityManager#checkPermission 方法不允许访问环境变量名称 |
getenv
public static MapString,String getenv()
返回当前系统环境的不可修改的字符串映射视图。环境是从名称到值的系统相关映射,从父进程传递到子进程。
如果系统不支持环境变量,则返回一个空映射。
返回的映射永远不会包含空键或值。尝试查询是否存在空键或值将引发 NullPointerException。尝试查询是否存在非 String 类型的键或值将引发 ClassCastException。
返回的地图及其集合视图可能不遵守 Object#equals 和 Object#hashCode 方法的一般约定。
返回的地图通常在所有平台上都区分大小写。
如果存在安全管理器,则使用 RuntimePermission(“getenv.*”) 权限调用其 SecurityManager#checkPermission 方法。这可能会导致抛出 SecurityException。
将信息传递给 Java 子进程时,系统属性通常优于环境变量。
返回:
环境作为变量名到值的映射
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 SecurityManager#checkPermission 方法不允许访问进程环境 |
exit
public static void exit(int status)
终止当前运行的 Java 虚拟机。 该参数用作状态码; 按照惯例,非零状态码表示异常终止。
该方法调用 Runtime 类中的 exit 方法。 此方法永远不会正常返回。
调用 System.exit(n) 实际上等效于调用:
Runtime.getRuntime().exit(n)
参数:
参数名称 | 参数描述 |
---|---|
status | 退出状态。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果安全管理器存在并且其 checkExit 方法不允许以指定状态退出。 |
gc
public static void gc()
运行垃圾收集器。
调用 gc 方法表明 Java 虚拟机花费精力回收未使用的对象,以便使它们当前占用的内存可用于快速重用。 当控制从方法调用返回时,Java 虚拟机已尽最大努力从所有丢弃的对象中回收空间。
调用 System.gc() 实际上等效于调用:
Runtime.getRuntime().gc()
runFinalization
public static void runFinalization()
运行任何等待终结的对象的终结方法。
调用此方法表明 Java 虚拟机花费精力运行已发现已丢弃但尚未运行其 finalize 方法的对象的 finalize 方法。 当控制从方法调用返回时,Java 虚拟机已尽最大努力完成所有未完成的终结。
调用 System.runFinalization() 实际上等效于调用:
Runtime.getRuntime().runFinalization()
runFinalizersOnExit
@Deprecated public static void runFinalizersOnExit(boolean value)
已弃用。 这种方法本质上是不安全的。 这可能会导致在其他线程同时操作这些对象时对活动对象调用终结器,从而导致行为不稳定或死锁。
在退出时启用或禁用终结; 这样做指定在 Java 运行时退出之前运行具有尚未自动调用的终结器的所有对象的终结器。 默认情况下,退出时的最终确定是禁用的。
如果存在安全管理器,则首先调用其 checkExit 方法,并以 0 作为其参数,以确保允许退出。 这可能会导致 SecurityException。
参数:
参数名称 | 参数描述 |
---|---|
value | 指示启用或禁用终结 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkExit 方法不允许退出。 |
load
public static void load(String filename)
加载由文件名参数指定的本机库。 文件名参数必须是绝对路径名。 如果 filename 参数在去除任何特定于平台的库前缀、路径和文件扩展名时,指示名称为 L 的库,并且名为 L 的本机库与 VM 静态链接,则 JNI_OnLoad_L 函数 调用由库导出的,而不是尝试加载动态库。 与参数匹配的文件名不必存在于文件系统中。 有关更多详细信息,请参阅 JNI 规范。 否则,文件名参数以与实现相关的方式映射到本机库映像。
调用 System.load(name) 实际上等效于调用:
Runtime.getRuntime().load(name)
参数:
参数名称 | 参数描述 |
---|---|
filename | 要加载的文件。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkLink 方法不允许加载指定的动态库 |
UnsatisfiedLinkError | 如果文件名不是绝对路径名,则本机库未与 VM 静态链接,或者主机系统无法将库映射到本机库映像。 |
NullPointerException | 如果文件名为空 |
loadLibrary
public static void loadLibrary(String libname)
加载由 libname 参数指定的本机库。 libname 参数不得包含任何特定于平台的前缀、文件扩展名或路径。 如果名为 libname 的本机库与 VM 静态链接,则调用该库导出的 JNI_OnLoad_libname 函数。 有关更多详细信息,请参阅 JNI 规范。 否则,libname 参数将从系统库位置加载并以与实现相关的方式映射到本机库映像。
调用 System.loadLibrary(name) 实际上等效于调用
Runtime.getRuntime().loadLibrary(name)
参数:
参数名称 | 参数描述 |
---|---|
libname | 库的名称。 |
Throws:
Throw名称 | Throw描述 |
---|---|
SecurityException | 如果存在安全管理器并且其 checkLink 方法不允许加载指定的动态库 |
UnsatisfiedLinkError | 如果 libname 参数包含文件路径,则本机库未与 VM 静态链接,或者该库无法由主机系统映射到本机库映像。 |
NullPointerException | 如果 libname 为null |
mapLibraryName
public static String mapLibraryName(String libname)
将库名称映射到表示本机库的特定于平台的字符串。
参数:
参数名称 | 参数描述 |
---|---|
libname | 库的名称。 |
返回:
平台相关的本地库名称。
Throws:
Throw名称 | Throw描述 |
---|---|
NullPointerException | 如果libname为null |