Module java.base
Package java.lang

Class System

java.lang.Object
java.lang.System

public final class System extends Object
System类包含几个有用的类字段和方法。它不能被实例化。System类提供的功能包括标准输入、标准输出和错误输出流;访问外部定义的属性和环境变量;加载文件和库的方法;以及一个快速复制数组部分的实用方法。
自版本:
1.0
  • Field Details

  • Method Details

    • setIn

      public static void setIn(InputStream in)
      重新分配"标准"输入流。首先,如果存在安全管理器,则调用其checkPermission方法,使用RuntimePermission("setIO")权限来查看重新分配"标准"输入流是否可以。
      参数:
      in - 新的标准输入流。
      抛出:
      SecurityException - 如果存在安全管理器且其checkPermission方法不允许重新分配标准输入流。
      自版本:
      1.1
      参见:
    • setOut

      public static void setOut(PrintStream out)
      重新分配"标准"输出流。首先,如果存在安全管理器,则调用其checkPermission方法,使用RuntimePermission("setIO")权限来查看重新分配"标准"输出流是否可以。
      参数:
      out - 新的标准输出流
      抛出:
      SecurityException - 如果存在安全管理器且其checkPermission方法不允许重新分配标准输出流。
      自版本:
      1.1
      参见:
    • setErr

      public static void setErr(PrintStream err)
      重新分配"标准"错误输出流。首先,如果存在安全管理器,则调用其checkPermission方法,使用RuntimePermission("setIO")权限来查看重新分配"标准"错误输出流是否可以。
      参数:
      err - 新的标准错误输出流。
      抛出:
      SecurityException - 如果存在安全管理器且其checkPermission方法不允许重新分配标准错误输出流。
      自版本:
      1.1
      另请参阅:
    • console

      public static Console console()
      返回与当前Java虚拟机关联的唯一Console对象,如果有的话。
      返回:
      系统控制台,如果有的话,否则null
      自版本:
      1.6
    • inheritedChannel

      public static Channel inheritedChannel() throws IOException
      返回从创建此Java虚拟机的实体继承的通道。此方法返回通过调用系统范围默认inheritedChannel方法获取的通道SelectorProvider对象。

      除了网络导向通道描述中的inheritedChannel,此方法将来可能返回其他类型的通道。

      返回:
      继承的通道,如果有的话,否则null
      抛出:
      IOException - 如果发生I/O错误
      SecurityException - 如果存在安全管理器且不允许访问该通道。
      自版本:
      1.5
    • setSecurityManager

      @Deprecated(since="17", forRemoval=true) public static void setSecurityManager(SecurityManager sm)
      Deprecated, for removal: This API element is subject to removal in a future version.
      This method is only useful in conjunction with the Security Manager, which is deprecated and subject to removal in a future release. Consequently, this method is also deprecated and subject to removal. There is no replacement for the Security Manager or this method.
      设置系统范围的安全管理器。如果已安装安全管理器,则此方法首先调用安全管理器的checkPermission方法,使用RuntimePermission("setSecurityManager")权限来确保替换现有安全管理器是可以的。这可能导致抛出SecurityException

      否则,参数将被建立为当前的安全管理器。如果参数为null且尚未建立安全管理器,则不会采取任何操作,方法只会简单地返回。

      实现注意:
      在JDK实现中,如果Java虚拟机启动时未设置系统属性java.security.manager或设置为特殊标记"disallow",则无法使用setSecurityManager方法设置安全管理器。有关更多详细信息,请参阅SecurityManager类规范的以下部分
      参数:
      sm - 安全管理器或null
      抛出:
      SecurityException - 如果已经设置了安全管理器且其checkPermission方法不允许替换
      UnsupportedOperationException - 如果sm为非null且不允许动态设置安全管理器
      另请参阅:
    • getSecurityManager

      @Deprecated(since="17", forRemoval=true) public static SecurityManager getSecurityManager()
      Deprecated, for removal: This API element is subject to removal in a future version.
      This method is only useful in conjunction with the Security Manager, which is deprecated and subject to removal in a future release. Consequently, this method is also deprecated and subject to removal. There is no replacement for the Security Manager or this method.
      获取系统范围的安全管理器。
      返回:
      如果当前应用程序已经建立了安全管理器,则返回该安全管理器;否则返回null
      另请参阅:
    • currentTimeMillis

      public static long currentTimeMillis()
      返回当前时间的毫秒数。请注意,返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,可能更大。例如,许多操作系统以十毫秒为单位测量时间。

      有关"计算机时间"和协调世界时(UTC)之间可能出现的轻微差异的讨论,请参阅Date类的描述。

      返回:
      当前时间与1970年1月1日午夜UTC之间的毫秒差。
      另请参阅:
    • nanoTime

      public static long nanoTime()
      返回正在运行的Java虚拟机的高分辨率时间源的当前值,以纳秒为单位。此方法仅用于测量经过的时间,与任何其他系统或挂钟时间概念无关。返回的值表示自某个固定但任意的起始时间(可能在未来,因此值可能为负)以来的纳秒数。所有对此方法的调用在Java虚拟机实例中使用相同的起始时间;其他虚拟机实例可能使用不同的起始时间。

      此方法提供纳秒精度,但不一定提供纳秒分辨率(即值更改的频率)- 除了保证分辨率至少与currentTimeMillis()一样好之外,不提供任何保证。

      连续调用之间的差异超过大约292年(263纳秒)将由于数值溢出而无法正确计算经过的时间。

      此方法返回的值仅在同一Java虚拟机实例中获取两个这样的值之间的差异时才具有意义。

      例如,要测量某些代码执行所需的时间:

       
       long startTime = System.nanoTime();
       // ... 被测量的代码 ...
       long elapsedNanos = System.nanoTime() - startTime;

      要将经过的时间与超时进行比较,请使用

       
       if (System.nanoTime() - startTime >= timeoutNanos) ...
      而不是
       
       if (System.nanoTime() >= startTime + timeoutNanos) ...
      因为可能会发生数值溢出的可能性。
      返回:
      正在运行的Java虚拟机的高分辨率时间源的当前值,以纳秒为单位
      自版本:
      1.5
    • arraycopy

      public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
      从指定源数组的指定位置开始,将数组的子序列复制到目标数组的指定位置。从由src引用的源数组到由dest引用的目标数组,将复制数组组件的数量等于length参数。在源数组中的位置srcPossrcPos+length-1的组件将分别复制到目标数组中的位置destPosdestPos+length-1

      如果srcdest参数引用同一个数组对象,则将执行复制,就好像首先将源数组中位置srcPossrcPos+length-1的组件复制到具有length组件的临时数组中,然后将临时数组的内容复制到目标数组的位置destPosdestPos+length-1

      如果destnull,则会抛出NullPointerException

      如果srcnull,则会抛出NullPointerException,并且目标数组不会被修改。

      否则,如果以下任一情况为真,则会抛出ArrayStoreException,并且目标数组不会被修改:

    • src参数引用不是数组的对象。
    • dest参数引用不是数组的对象。
    • src参数和dest参数引用具有不同原始类型的数组。
    • src参数引用具有原始组件类型的数组,而dest参数引用具有引用组件类型的数组。
    • src参数引用具有引用组件类型的数组,而dest参数引用具有原始组件类型的数组。
    • 否则,如果以下任一情况为真,则会抛出IndexOutOfBoundsException,并且目标数组不会被修改:

    • srcPos参数为负数。
    • destPos参数为负数。
    • length参数为负数。
    • srcPos+length大于源数组的长度src.length
    • destPos+length大于目标数组的长度dest.length
    • 否则,如果源数组的实际组件从位置srcPossrcPos+length-1无法通过赋值转换为目标数组的组件类型,则会抛出ArrayStoreException。在这种情况下,让k是小于长度的最小非负整数,使得src[srcPos+k]无法转换为目标数组的组件类型;当抛出异常时,源数组的组件从位置srcPossrcPos+k-1将已经被复制到目标数组的位置destPosdestPos+k-1,并且目标数组的其他位置不会被修改。(由于已列出的限制,此段落实际上仅适用于两个数组都具有组件类型为引用类型的情况。)

      参数:
      src - 源数组。
      srcPos - 源数组中的起始位置。
      dest - 目标数组。
      destPos - 目标数据中的起始位置。
      length - 要复制的数组元素数量。
      抛出:
      IndexOutOfBoundsException - 如果复制会导致访问数组边界外的数据。
      ArrayStoreException - 如果无法将src数组中的元素存储到dest数组中,因为类型不匹配。
      NullPointerException - 如果srcdestnull
    • identityHashCode

      public static int identityHashCode(Object x)
      返回给定对象的哈希码,与默认方法hashCode()返回的哈希码相同,无论给定对象的类是否重写了hashCode()。空引用的哈希码为零。
      参数:
      x - 要计算哈希码的对象
      返回:
      哈希码
      自版本:
      1.1
      参见:
    • getProperties

      public static Properties getProperties()
      确定当前系统属性。首先,如果存在安全管理器,则调用其不带参数的checkPropertiesAccess方法。这可能导致安全异常。

      用于getProperty(String)方法的当前系统属性集将作为Properties对象返回。如果没有当前系统属性集,则首先创建并初始化系统属性集。该系统属性集包括以下每个键的值,除非相关值的描述指示该值是可选的。

      显示属性键和相关值
      相关值的描述
      java.version Java运行时环境版本,可以解释为Runtime.Version

      如果在构建时,此运行时实现的规范经历了维护发布,则定义了java.specification.maintenance.version属性。当定义时,其值标识该维护发布。要指示第一个维护发布,此属性将具有值"1",要指示第二个维护发布,此属性将具有值"2",依此类推。

      系统属性值中的多个路径由平台的路径分隔符字符分隔。

      请注意,即使安全管理器不允许getProperties操作,它也可能选择允许getProperty(String)操作。

      API注释:
      更改标准系统属性可能会导致不可预测的结果,除非另有规定。 在初始化期间或首次使用时,属性值可能会被缓存。在使用getProperties()setProperties(Properties)setProperty(String, String)clearProperty(String)之后初始化设置标准属性可能不会产生预期效果。
      实现注释:
      除了标准系统属性外,系统属性可能包括以下键:
      显示属性键和关联值
      关联值的描述
      jdk.module.path 应用程序模块路径
      jdk.module.upgrade.path 升级模块路径
      jdk.module.main 初始/主模块的模块名称
      jdk.module.main.class 初始模块的主类名称
      file.encoding 默认字符集的名称,默认为UTF-8。该属性可以在命令行上设置为值UTF-8COMPAT。如果在命令行上设置为值COMPAT,则在启动期间将该值替换为native.encoding属性的值。将属性设置为除UTF-8COMPAT之外的值会导致未指定的行为。
      返回:
      系统属性
      抛出:
      SecurityException - 如果存在安全管理器且其checkPropertiesAccess方法不允许访问系统属性。
      参见:
    • lineSeparator

      public static String lineSeparator()
      返回系统相关的换行符字符串。它始终返回相同的值 - 系统属性 line.separator 的初始值。

      在UNIX系统上,它返回"\n";在Microsoft Windows系统上,它返回"\r\n"

      返回:
      系统相关的换行符字符串
      自版本:
      1.7
    • setProperties

      public static void setProperties(Properties props)
      将系统属性设置为Properties参数。首先,如果存在安全管理器,则调用其不带参数的checkPropertiesAccess方法。这可能导致安全异常。

      该参数成为供getProperty(String)方法使用的当前系统属性集。如果参数为null,则当前系统属性集将被忘记。

      API注释:
      更改标准系统属性可能会导致不可预测的结果。有关详细信息,请参阅getProperties
      参数:
      props - 新的系统属性。
      抛出:
      SecurityException - 如果存在安全管理器且其checkPropertiesAccess方法不允许访问系统属性。
      参见:
    • getProperty

      public static String getProperty(String key)
      获取指定键指示的系统属性。首先,如果存在安全管理器,则调用其以键作为参数的checkPropertyAccess方法。这可能导致SecurityException。

      如果没有当前的系统属性集,则首先创建并初始化一组系统属性,方式与getProperties方法相同。

      API注释:
      更改标准系统属性可能会导致不可预测的结果。有关详细信息,请参阅getProperties
      参数:
      key - 系统属性的名称。
      返回:
      系统属性的字符串值,如果没有具有该键的属性,则返回null
      抛出:
      SecurityException - 如果存在安全管理器且其checkPropertyAccess方法不允许访问指定的系统属性。
      NullPointerException - 如果keynull
      IllegalArgumentException - 如果key为空。
      参见:
    • getProperty

      public static String getProperty(String key, String def)
      获取指定键指示的系统属性。首先,如果存在安全管理器,则调用其以key作为参数的checkPropertyAccess方法。

      如果没有当前的系统属性集,则首先创建并初始化一组系统属性,方式与getProperties方法相同。

      参数:
      key - 系统属性的名称。
      def - 默认值。
      返回:
      系统属性的字符串值,如果没有具有该键的属性,则返回默认值。
      抛出:
      SecurityException - 如果存在安全管理器且其checkPropertyAccess方法不允许访问指定的系统属性。
      NullPointerException - 如果keynull
      IllegalArgumentException - 如果key为空。
      参见:
    • setProperty

      public static String setProperty(String key, String value)
      设置由指定键指示的系统属性。首先,如果存在安全管理器,则调用其SecurityManager.checkPermission方法,参数为PropertyPermission(key, "write")。这可能导致抛出SecurityException。如果没有抛出异常,则将指定的属性设置为给定值。
      API注释:
      更改标准系统属性可能会导致不可预测的结果。有关详细信息,请参阅getProperties
      参数:
      key - 系统属性的名称。
      value - 系统属性的值。
      返回:
      系统属性的先前值,如果没有,则返回null
      抛出:
      SecurityException - 如果存在安全管理器且其checkPermission方法不允许设置指定的属性。
      NullPointerException - 如果keyvaluenull
      IllegalArgumentException - 如果key为空。
      自版本:
      1.2
      参见:
    • clearProperty

      public static String clearProperty(String key)
      移除由指定键指示的系统属性。首先,如果存在安全管理器,则调用其SecurityManager.checkPermission方法,参数为PropertyPermission(key, "write")。这可能导致抛出SecurityException。如果没有抛出异常,则移除指定的属性。
      API注释:
      更改标准系统属性可能会导致不可预测的结果,除非另有规定。有关详细信息,请参阅getProperties方法。
      参数:
      key - 要移除的系统属性的名称。
      返回:
      系统属性的先前字符串值,如果没有具有该键的属性,则返回null
      抛出:
      SecurityException - 如果存在安全管理器且其checkPropertyAccess方法不允许访问指定的系统属性。
      NullPointerException - 如果keynull
      IllegalArgumentException - 如果key为空。
      自版本:
      1.5
      另请参阅:
    • getenv

      public static String getenv(String name)
      获取指定环境变量的值。环境变量是系统相关的外部命名值。

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

      系统属性环境变量在概念上都是名称和值之间的映射。这两种机制都可以用于将用户定义的信息传递给Java进程。环境变量具有更全局的影响,因为它们对定义它们的进程的所有后代都是可见的,而不仅仅是直接的Java子进程。它们可能具有略有不同的语义,例如在不同操作系统上的大小写不敏感性。因此,环境变量更有可能产生意外的副作用。最好在可能的情况下使用系统属性。应在希望产生全局效果或外部系统接口需要环境变量(如PATH)时使用环境变量。

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

      参数:
      name - 环境变量的名称
      返回:
      变量的字符串值,如果系统环境中未定义该变量,则返回null
      抛出:
      NullPointerException - 如果namenull
      SecurityException - 如果存在安全管理器且其checkPermission方法不允许访问环境变量name
      另请参阅:
    • getenv

      public static Map<String,String> getenv()
      返回当前系统环境的不可修改的字符串映射视图。环境是从父进程传递给子进程的系统相关映射,从名称到值的映射。

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

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

      返回的映射及其集合视图可能不遵守Object.equals(java.lang.Object)Object.hashCode()方法的一般契约。

      返回的映射在所有平台上通常区分大小写。

      如果存在安全管理器,则将调用其checkPermission方法,使用RuntimePermission("getenv.*")权限。这可能导致抛出一个SecurityException

      在向Java子进程传递信息时,通常优先使用系统属性而不是环境变量。

      返回:
      作为变量名称到值的映射的环境
      抛出:
      SecurityException - 如果存在安全管理器且其checkPermission方法不允许访问进程环境
      自版本:
      1.5
      另请参阅:
    • getLogger

      public static System.Logger getLogger(String name)
      返回供调用者使用的Logger实例。
      API注释:
      此方法可能延迟调用LoggerFinder.getLogger方法,以创建由日志后端提供的实际记录器,例如,允许在系统初始化时间获取记录器以允许在系统初始化时间获取记录器。
      实现要求:
      此方法返回的实例将通过调用LoggerFinder.getLogger(name, module)来路由消息到通过调用获得的记录器,其中module是调用者的模块。在没有调用者帧的堆栈上下文中调用System.getLogger的情况下(例如,直接从JNI附加的线程中调用),将抛出IllegalCallerException。在这种情况下,要获取记录器,可以使用一个将被隐式标识为调用者的辅助类,或者使用系统LoggerFinder来获取记录器。请注意,后者可能会急切地初始化底层的日志系统。
      参数:
      name - 记录器的名称。
      返回:
      可供调用类使用的System.Logger实例。
      抛出:
      NullPointerException - 如果namenull
      IllegalCallerException - 如果堆栈上没有Java调用者帧。
      自版本:
      9
    • getLogger

      public static System.Logger getLogger(String name, ResourceBundle bundle)
      返回供调用者使用的本地化实例的Logger。返回的记录器将使用提供的资源包进行消息本地化。
      API注释:
      此方法旨在在系统完全初始化后使用。此方法可能触发立即加载和初始化System.LoggerFinder服务,如果Java运行时尚未准备好初始化具体的服务实现,则可能会导致问题。在引导序列早期加载并需要记录本地化消息的系统类应使用getLogger(java.lang.String)创建记录器,然后使用带有资源包参数的日志方法。
      实现要求:
      返回的记录器将执行由LoggerFinder.getLocalizedLogger(name, bundle, module)指定的消息本地化,其中module是调用者的模块。在没有调用者帧的堆栈上下文中调用System.getLogger的情况下(例如,直接从JNI附加的线程中调用),将抛出IllegalCallerException。在这种情况下,要获取记录器,可以使用一个将被隐式标识为调用者的辅助类,或者使用系统LoggerFinder来获取记录器。请注意,后者可能会急切地初始化底层的日志系统。
      参数:
      name - 记录器的名称。
      bundle - 一个资源包。
      返回:
      将使用提供的资源包进行消息本地化的System.Logger实例。
      抛出:
      NullPointerException - 如果namenullbundlenull
      IllegalCallerException - 如果堆栈上没有Java调用者帧。
      自版本:
      9
    • exit

      public static void exit(int status)
      启动Java虚拟机的关闭序列。除非安全管理器拒绝退出,否则此方法会启动关闭序列(如果尚未启动),然后无限期地阻塞。此方法既不返回也不抛出异常;也就是说,它既不正常完成也不突然完成。

      参数用作状态码。按照惯例,非零状态码表示异常终止。

      调用System.exit(n)实际上等效于调用:

          Runtime.getRuntime().exit(n)
      
      实现注意事项:
      关闭序列的启动由Runtime.exit(int)记录。
      参数:
      status - 退出状态。
      抛出:
      SecurityException - 如果存在安全管理器且其checkExit方法不允许以指定状态退出。
      参见:
    • gc

      public static void gc()
      运行Java虚拟机中的垃圾收集器。

      调用gc方法表明Java虚拟机会努力回收未使用的对象,以便将它们当前占用的内存空间可供Java虚拟机重用。当方法调用返回控制权时,Java虚拟机已尽最大努力从所有未使用的对象中回收空间。不能保证此努力会回收任何特定数量的未使用对象,回收任何特定数量的空间,或在方法返回之前或之后的任何特定时间内完成,如果有的话。也不能保证此努力会确定任何特定数量对象的可达性变化,或者会清除和排队任何特定数量的Reference对象。

      调用System.gc()实际上等效于调用:

       Runtime.getRuntime().gc()
       
      参见:
    • runFinalization

      @Deprecated(since="18", forRemoval=true) public static void runFinalization()
      Deprecated, for removal: This API element is subject to removal in a future version.
      Finalization has been deprecated for removal. See Object.finalize() for background information and details about migration options.

      When running in a JVM in which finalization has been disabled or removed, no objects will be pending finalization, so this method does nothing.

      运行任何待终结对象的终结方法。调用此方法表明Java虚拟机会努力运行已被发现为已丢弃但其finalize方法尚未运行的对象的finalize方法。当方法调用返回控制权时,Java虚拟机已尽最大努力完成所有未完成的终结。

      调用System.runFinalization()实际上等效于调用:

       Runtime.getRuntime().runFinalization()
       
      参见Java语言规范
      12.6 类实例的终结
      参见:
    • load

      public static void load(String filename)
      加载由文件名参数指定的本机库。文件名参数必须是绝对路径名。如果文件名参数在剥离任何特定于平台的库前缀、路径和文件扩展名后指示一个名为L的库,且名为L的本机库已静态链接到VM,则调用库导出的JNI_OnLoad_L函数,而不是尝试加载动态库。文件名匹配参数不必存在于文件系统中。有关更多详细信息,请参阅JNI规范。否则,文件名参数将以实现相关的方式映射到本机库映像。

      调用System.load(name)实际上等效于调用:

       Runtime.getRuntime().load(name)
       
      参数:
      filename - 要加载的文件。
      抛出:
      SecurityException - 如果存在安全管理器且其checkLink方法不允许加载指定的动态库
      UnsatisfiedLinkError - 如果文件名不是绝对路径名、本机库未与VM静态链接,或主机系统无法将库映射到本机库映像。
      NullPointerException - 如果filenamenull
      外部规范
      参见:
    • loadLibrary

      public static void loadLibrary(String libname)
      加载由libname参数指定的本机库。 libname参数不得包含任何特定于平台的前缀、文件扩展名或路径。如果名为libname的本机库已静态链接到VM,则调用库导出的JNI_OnLoad_libname函数。有关更多详细信息,请参阅JNI规范。否则,libname参数将从系统库位置加载,并以实现相关的方式映射到本机库映像。

      调用System.loadLibrary(name)实际上等效于调用

       Runtime.getRuntime().loadLibrary(name)
       
      参数:
      libname - 库的名称。
      抛出:
      SecurityException - 如果存在安全管理器且其checkLink方法不允许加载指定的动态库
      UnsatisfiedLinkError - 如果libname参数包含文件路径、本机库未与VM静态链接,或主机系统无法将库映射到本机库映像。
      NullPointerException - 如果libnamenull
      外部规范
      参见:
    • mapLibraryName

      public static String mapLibraryName(String libname)
      将库名称映射为表示本机库的特定于平台的字符串。
      参数:
      libname - 库的名称。
      返回:
      一个特定于平台的本机库名称。
      抛出:
      NullPointerException - 如果libnamenull
      自:
      1.2
      参见: