Java高级语法详解之系统辅助工具类
- 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) | ||
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应用程序。