38、Java基础教程之常用类库·System类

  • 1️⃣ 概念
  • 2️⃣ 优势和缺点
  • 3️⃣ 使用
    • 3.1 System类常用方法
  • 3.2 使用技巧
  • 4️⃣ 应用场景
  • * 总结

*

1️⃣ 概念

Java的System类是Java标准库中一个重要且常用的类。它被设计用于提供与系统相关的操作和信息访问功能。System类的设计目的是为了让开发者更方便地与底层操作系统进行交互,并提供一些常见而有用的系统级别的功能。

System类是一个包含各种静态方法和字段的系统辅助工具类。它提供了一系列静态方法,用于访问系统属性、执行外部命令、获取系统时间等操作。

System类是Java标准库的一部分,它与底层的操作系统交互通过JNI(Java Native Interface)实现,通过调用本地方法访问底层操作系统的功能。

System类具有以下特征:

  • 类中的方法和字段都是静态的,可以直接通过类名调用;
  • 提供了许多与系统环境和资源交互的方法,如获取和设置系统属性、标准输入输出流的访问、执行外部命令等;
  • 提供了与垃圾回收器、Java虚拟机等底层操作相关的方法。

2️⃣ 优势和缺点

  • 优点
    提供了统一的接口,方便访问与系统相关的信息和行为;提供了跨平台性,使得编写可移植的Java代码成为可能。
  • 缺点
    过度使用System类的静态方法可能导致代码耦合性增强;类中有些方法在不同的平台上可能表现不一致。

3️⃣ 使用

3.1 System类常用方法

下面表格中列出了System类中的方法和字段,并提供了简要描述。
这些方法和字段允许开发者与底层操作系统进行交互,获取系统属性、执行外部命令、管理输入输出等操作:

类别 名称 描述
方法 arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 复制数组中的元素到另一个数组
currentTimeMillis() 返回当前时间的毫秒数
exit(int status) 退出Java虚拟机,可使用指定的状态码作为程序的结束代码
gc() 强制运行垃圾回收器
getenv(String name) 获取指定环境变量的值
getProperties() 获取当前系统属性的集合。 如获取操作系统版本、文件分隔符等
getProperty(String key) 根据键名获取系统属性的值
getProperty(String key, String defaultValue) 根据键名获取系统属性的值,如果没有找到则返回默认值
load(String filename) 加载本地库
loadLibrary(String libname) 加载指定名称的本地库
nanoTime() 返回当前系统时间的纳秒数
runFinalization() 请求运行已被丢弃对象的 finalize() 方法
runFinalizersOnExit(boolean value) 在退出程序时运行所有对象的 finalize() 方法
setErr(PrintStream err) 重新指定标准错误输出流
setIn(InputStream in) 重新指定标准输入流
setOut(PrintStream out) 重新指定标准输出流
setProperty(String key, String value) 设置指定键的系统属性值
identityHashCode(Object x) 返回给定对象的哈希码
字段 in 标准输入流(InputStream)
out 标准输出流(PrintStream)
err 标准错误输出流(PrintStream)

*关于exit(int status)方法的参数值问题?

在System类的exit(int status)方法中,可以传递不同的整数值作为参数,每个值都有特定的意义。以下是常用的参数值及其含义:

  • 0:一般表示程序正常终止。通常在没有错误或异常情况下,通过该状态码退出程序。
  • 非零值:一般表示程序非正常终止,可能存在某种错误、异常或其他不可预期的情况。具体的非零值可以根据需要进行定义和约定。

注意,除了0以外,非零状态码的具体含义并没有明确规定。在实际应用中,开发者可以根据自身需求自定义和解释这些状态码。通常,非零状态码被用来表示不同的错误类型或异常情况,以便程序的调用方或脚本等能够根据状态码进行后续处理。

尽管非零值可以用于自定义特定意义的状态码,但建议遵循一些常见的惯例和约定,例如使用负数表示特定错误类型,使用正数表示某种成功状态的变体等。

总之,exit(int status)方法的参数可以是任意整数值,但一般而言,0通常表示正常终止,非零值表示非正常终止或错误情况。

下面是一个使用System类的各个方法和字段的Java案例程序:

import java.util.Arrays;

public class SystemExample {
   
     
    public static void main(String[] args) {
   
     
        // 方法: arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
        int[] sourceArray = {
   
     1, 2, 3, 4, 5};
        int[] destinationArray = new int[5];
        System.arraycopy(sourceArray, 0, destinationArray, 0, sourceArray.length);
        System.out.println(Arrays.toString(destinationArray));

        // 方法: currentTimeMillis()
        long currentTime = System.currentTimeMillis();
        System.out.println(currentTime);

        // 方法: gc()
        System.gc();

        // 方法: getenv(String name)
        String javaHome = System.getenv("JAVA_HOME");
        System.out.println("JAVA_HOME=" + javaHome);

        // 方法: getProperties()
        System.out.println("Properties=" + System.getProperties());

        // 方法: getProperty(String key)
        String osVersion = System.getProperty("os.version");
        System.out.println("os.version=" + osVersion);

        // 方法: getProperty(String key, String defaultValue)
        String javaVendor = System.getProperty("java.vendor", "Unknown");
        System.out.println("java.vendor=" + javaVendor);

        // 方法: load(String filename)
//        System.load("mylibrary.dll");

        // 方法: loadLibrary(String libname)
//        System.loadLibrary("mylibrary");

        // 方法: nanoTime()
        long startTime = System.nanoTime();
        // code here...
        long endTime = System.nanoTime();
        long executionTime = endTime - startTime;
        System.out.println("executionTime = " + executionTime);

        // 方法: runFinalization()
        System.runFinalization();

        // 方法: setErr(PrintStream err)
        System.setErr(System.err);

        // 方法: setIn(InputStream in)
        System.setIn(System.in);

        // 方法: setOut(PrintStream out)
        System.setOut(System.out);

        // 方法: setProperty(String key, String value)
        System.setProperty("my.property", "myValue");
        System.out.println("my.property=" +  System.getProperty("my.property"));

        // 方法: identityHashCode(Object x)
        Object myObject = new Object();
        int objectHashCode = System.identityHashCode(myObject);
        System.out.println("objectHashCode = " + objectHashCode);

        // 字段: in
        try {
   
     
            int read = System.in.read();
            System.out.println(read);
        } catch (Exception e) {
   
     
            e.printStackTrace();
        }

        // 字段: out
        System.out.println("Hello, World!");

        // 字段: err
        System.err.println("Error occurred!");

        // 方法: exit(int status)
        System.exit(0);
        System.out.println("JVM已经停止运行,这里的代码执行不到...");
    }
}

程序运行结果如下:

[1, 2, 3, 4, 5]
1687942503061
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_162
Properties={java.runtime.name=Java(TM) SE Runtime Environment, sun.boot.library.path=C:\Program Files\Java\jdk1.8.0_202\jre\bin, java.vm.version=25.202-b08, java.vm.vendor=Oracle Corporation, java.vendor.url=http://java.oracle.com/, path.separator=;, java.vm.name=Java HotSpot(TM) 64-Bit Server VM, file.encoding.pkg=sun.io, user.country=CN, user.script=, sun.java.launcher=SUN_STANDARD, sun.os.patch.level=, java.vm.specification.name=Java Virtual Machine Specification, user.dir=C:\Users\86182\IdeaProjects\untitled15, java.runtime.version=1.8.0_202-b08, java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment, java.endorsed.dirs=C:\Program Files\Java\jdk1.8.0_202\jre\lib\endorsed, os.arch=amd64, java.io.tmpdir=C:\Users\86182\AppData\Local\Temp\, line.separator=
, java.vm.specification.vendor=Oracle Corporation, user.variant=, os.name=Windows 10, sun.jnu.encoding=GBK, java.library.path=C:\Program Files\Java\jdk1.8.0_202\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:\MyApp\;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\ProgramData\Oracle\Java\javapath;c:\windows\system32;c:\windows;c:\windows\System32\Wbem;c:\windows\System32\WindowsPowerShell\v1.0\;c:\windows\System32\OpenSSH\;C:\Program Files\Java\jdk1.8.0_162\bin;C:\Program Files\Java\jdk1.8.0_162\jre\bin;D:\MyApp\TortoiseSVN\bin;*:\MyApp\dmdbms\bin;D:\MyApp\mysql-5.6.47-winx64\bin;C:\Program Files\Git\cmd;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\HP\Common\HPDestPlgIn\;D:\MyApp\NetSarang\;D:\MyApp\Python\Python311\Scripts\;D:\MyApp\Python\Python311\;C:\Users\86182\AppData\Local\Microsoft\WindowsApps;C:\Program Files (x86)\HP\Common\HPDestPlgIn\;D:\MyApp\JetBrains\IntelliJ IDEA 2021.2.3\bin;;., java.specification.name=Java Platform API Specification, java.class.version=52.0, sun.management.compiler=HotSpot 64-Bit Tiered Compilers, os.version=10.0, user.home=C:\Users\86182, user.timezone=, java.awt.printerjob=sun.awt.windows.WPrinterJob, file.encoding=UTF-8, java.specification.version=1.8, java.class.path=C:\Program Files\Java\jdk1.8.0_202\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\rt.jar;C:\Users\86182\IdeaProjects\untitled15\out\production\untitled15;D:\MyApp\JetBrains\IntelliJ IDEA 2021.2.3\lib\idea_rt.jar, user.name=86182, java.vm.specification.version=1.8, sun.java.command=com.xiaoshan.SystemExample, java.home=C:\Program Files\Java\jdk1.8.0_202\jre, sun.arch.data.model=64, user.language=zh, java.specification.vendor=Oracle Corporation, awt.toolkit=sun.awt.windows.WToolkit, java.vm.info=mixed mode, java.version=1.8.0_202, java.ext.dirs=C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext, sun.boot.class.path=C:\Program Files\Java\jdk1.8.0_202\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_202\jre\classes, java.vendor=Oracle Corporation, file.separator=\, java.vendor.url.bug=http://bugreport.sun.com/bugreport/, sun.io.unicode.encoding=UnicodeLittle, sun.cpu.endian=little, sun.desktop=windows, sun.cpu.isalist=amd64}
os.version=10.0
java.vendor=Oracle Corporation
executionTime = 300
my.property=myValue
objectHashCode = 460141958

666
10
Hello, World!
Error occurred!

注意当程序运行到第69行int read = System.in.read();时,需要在console控制台输入数据,程序才会再继续往下执行结束。

3.2 使用技巧

System类在使用时存在以下使用技巧以及注意事项:

  • 在使用System类时,应注意避免滥用静态方法,以免导致代码难以维护和测试。推荐将与System类相关的逻辑封装到单独的模块中,以提高代码的可扩展性和可测试性;
  • System类中的方法多用于与底层系统交互,因此需要对每个操作的结果进行适当的检查和异常处理。

4️⃣ 应用场景

System类可以在多种场景下发挥重要作用:

  • 系统属性的获取和配置,如读取和设置环境变量、文件路径、编码等;
  • 外部命令的执行和控制,如调用系统命令行工具完成特定任务;
  • 监控程序和程序性能优化,通过测量程序运行时间和高效的数组复制等操作。

* 总结

System类是Java标准库提供的重要工具类,可用于访问与系统相关的操作、信息和资源。它提供了易于使用且跨平台的接口,使得开发者可以更方便地与底层系统进行交互。

合理并正确地使用System类,可以帮助实现更灵活、高效和可移植的Java应用程序。


[* ]nbsp_nbsp 1