Java OS 操作
尽管 Java 的设计理念是“一次编写,到处运行”(Write Once, Run Anywhere),具有很高的平台独立性,但有时我们的应用程序仍然需要与底层的操作系统(OS)进行交互。本章将介绍几种在 Java 中与操作系统进行通信的方式。
系统属性 (System Properties)
系统属性是关于 Java 运行时环境和当前操作系统配置的信息集合。JVM 在启动时会初始化这些属性。您可以通过 System 类来访问它们。
System.getProperties(): 返回一个Properties对象,包含所有的系统属性。System.getProperty(key): 获取指定键(key)的系统属性值。
常见的系统属性键:
| 键 | 描述 |
|---|---|
java.version | Java 运行时环境版本 |
java.home | Java 安装目录 |
os.name | 操作系统的名称 |
os.version | 操作系统的版本 |
user.name | 当前用户的账户名称 |
user.home | 当前用户的主目录 |
user.dir | 用户的当前工作目录 |
file.separator | 文件分隔符(在 UNIX 是 /,在 Windows 是 \) |
java
public class SystemPropertiesExample {
public static void main(String[] args) {
// 获取单个系统属性
String osName = System.getProperty("os.name");
String userHome = System.getProperty("user.home");
String javaVersion = System.getProperty("java.version");
System.out.println("操作系统: " + osName);
System.out.println("用户主目录: " + userHome);
System.out.println("Java 版本: " + javaVersion);
// 打印所有系统属性
// System.getProperties().list(System.out);
}
}环境变量 (Environment Variables)
环境变量是由操作系统维护的动态命名值,它们可以影响正在运行的进程的行为。与系统属性不同,环境变量是独立于 JVM 的,是系统级别的配置。
System.getenv(): 返回一个不可修改的Map<String, String>,包含所有的环境变量。System.getenv(name): 获取指定名称的环境变量的值。
java
import java.util.Map;
public class EnvironmentVariableExample {
public static void main(String[] args) {
// 获取单个环境变量 (例如 PATH)
String pathVar = System.getenv("PATH");
System.out.println("PATH 环境变量: " + pathVar);
// 遍历所有环境变量
// Map<String, String> envMap = System.getenv();
// for (String envName : envMap.keySet()) {
// System.out.format("%s=%s%n", envName, envMap.get(envName));
// }
}
}执行外部命令
Java 允许您从应用程序内部执行操作系统的命令。现代 Java 中推荐使用 ProcessBuilder 类,因为它提供了比旧的 Runtime.exec() 方法更多的控制和灵活性。
使用 ProcessBuilder
ProcessBuilder 的基本步骤如下:
- 创建一个
ProcessBuilder实例,并传入命令及其参数。 - (可选)配置工作目录、环境变量、重定向输入/输出流等。
- 调用
start()方法来执行命令,这将返回一个Process对象。 - 通过
Process对象与正在运行的进程交互,例如等待其完成或读取其输出。
java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class ExecuteCommandExample {
public static void main(String[] args) {
// 判断当前操作系统
boolean isWindows = System.getProperty("os.name").toLowerCase().startsWith("windows");
// 创建 ProcessBuilder 对象
ProcessBuilder processBuilder = new ProcessBuilder();
// 根据操作系统设置不同的命令
if (isWindows) {
// 在 Windows 上执行 'dir' 命令
processBuilder.command("cmd.exe", "/c", "dir");
} else {
// 在 macOS/Linux 上执行 'ls -l'
processBuilder.command("sh", "-c", "ls -l");
}
try {
// 启动进程
Process process = processBuilder.start();
// 读取命令的标准输出
StringBuilder output = new StringBuilder();
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
output.append(line).append("\n");
}
// 等待进程执行完毕,并获取退出码
int exitCode = process.waitFor();
System.out.println("\n命令执行完毕,退出码: " + exitCode);
System.out.println("命令输出:");
System.out.println(output);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}使用 ProcessBuilder 可以非常方便地执行系统命令、运行脚本或调用其他命令行工具,从而将 Java 应用程序与更广泛的系统环境集成起来。