Java中的System类
`System`类是Java中的一个预定义类,它属于`java.lang`包,因此无需显式导入即可使用。该类提供了一系列用于访问系统资源的静态方法和变量。这些资源包括标准输入、输出和错误流,以及访问环境变量和加载库的方法。
主要方法和功能
1. 标准输入输出和错误流
- `System.out`:用于打印输出到标准输出设备(通常是控制台)。
- `System.err`:用于打印错误消息到标准错误设备(也是控制台,但通常用于区分正常输出和错误信息)。
- `System.in`:用于从标准输入设备(如键盘)读取数据。
2. 环境变量
- `getenv()`:用于获取指定的环境变量值。
- `getenv()`(无参数):获取所有环境变量的不可修改映射。
3. 系统属性
- `getProperty(String key)`:获取系统属性的值。
- `getProperty(String key, String def)`:获取系统属性的值,如果属性不存在,则返回默认值。
- `setProperties(Properties props)`:设置系统属性。这通常不推荐,因为大多数系统属性在JVM启动时就已经设置好了。
4. 其他实用方法
- `arraycopy(Object src, int srcPos, Object dest, int destPos, int length)`:这是一个静态方法,用于在数组之间进行复制。尽管它不是`System`类特有的,但因为它非常有用,所以经常与`System`类一起提及。
- `currentTimeMillis()`:返回自1970年1月1日00:00:00 GMT以来的毫秒数。
- `exit(int status)`:终止当前运行的Java虚拟机。参数`status`用于表示退出状态;按照惯例,非零值表示异常终止。
- `gc()`:请求垃圾收集器运行。但是,请注意,这只是一个请求,JVM可以忽略它。
- `identityHashCode(Object x)`:返回给定对象的“系统身份哈希码”。这个哈希码是由JVM为对象内部使用的,并且在对象的生命周期内保持不变。
代码示例和注释
标准输入输出示例
public class SystemIOTest {
public static void main(String[] args) {
// 向标准输出打印消息
System.out.println("Hello, World!");
// 从标准输入读取一行文本
Scanner scanner = new Scanner(System.in);
System.out.print("Enter your name: ");
String name = scanner.nextLine();
// 向标准输出打印用户输入
System.out.println("Hello, " + name + "!");
// 关闭scanner
scanner.close();
}
}
访问环境变量
public class SystemEnvTest {
public static void main(String[] args) {
// 获取名为"PATH"的环境变量值
String path = System.getenv("PATH");
if (path != null) {
System.out.println("PATH environment variable: " + path);
} else {
System.out.println("PATH environment variable is not set.");
}
// 获取所有环境变量
Map<String, String> env = System.getenv();
for (Map.Entry<String, String> entry : env.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
}
}
访问系统属性
public class SystemPropertiesTest {
public static void main(String[] args) {
// 获取Java运行时环境的版本
String javaVersion = System.getProperty("java.version");
System.out.println("Java Version: " + javaVersion);
// 尝试获取一个不存在的属性,并提供默认值
String nonExistentProperty = System.getProperty("non.existent.property", "Default Value");
System.out.println("Non-existent Property: " + nonExistentProperty);
// 注意:修改系统属性通常不是个好主意,这里只是展示如何做到
// System.setProperty("some.property", "newValue");
}
}
垃圾收集和系统退出
public class SystemGCExample {
public static void main(String[] args) {
// 创建一个很大的数组来模拟垃圾回收压力
byte[] largeArray = new byte[1024 * 1024]; // 1MB array
// 调用gc()方法请求垃圾收集器运行
System.gc();
System.out.println("GC has been called, but it may not run immediately.");
// Exit the application after a delay to ensure the output is visible.
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
System.out.println("Sleep interrupted.");
}
// 退出程序,这里使用0作为状态码表示正常退出
System.exit(0);
}
}
请注意,`System.exit(int status)`方法一旦调用,将立即停止Java应用程序,不会等待其他线程完成。任何在`System.exit()`之后执行的代码都不会执行。因此,上面的代码实际上不会打印出“GC has been called...”这行输出,因为程序在调用`System.exit(0)`后立即退出了。在实际应用中,不应该在程序退出前调用`System.gc()`,因为这会打断正常的垃圾回收过程。
以上代码片段展示了`System`类中一些常见的方法和功能。尽管`System`类包含的方法不是最丰富的,但它们提供了访问系统资源和进行基本系统管理的强大工具。当需要与系统环境变量、属性、输入输出流等交互时,`System`类将是一个非常有用的工具。