Skip to content

Java OS 操作

尽管 Java 的设计理念是“一次编写,到处运行”(Write Once, Run Anywhere),具有很高的平台独立性,但有时我们的应用程序仍然需要与底层的操作系统(OS)进行交互。本章将介绍几种在 Java 中与操作系统进行通信的方式。

系统属性 (System Properties)

系统属性是关于 Java 运行时环境和当前操作系统配置的信息集合。JVM 在启动时会初始化这些属性。您可以通过 System 类来访问它们。

  • System.getProperties(): 返回一个 Properties 对象,包含所有的系统属性。
  • System.getProperty(key): 获取指定键(key)的系统属性值。

常见的系统属性键:

描述
java.versionJava 运行时环境版本
java.homeJava 安装目录
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 的基本步骤如下:

  1. 创建一个 ProcessBuilder 实例,并传入命令及其参数。
  2. (可选)配置工作目录、环境变量、重定向输入/输出流等。
  3. 调用 start() 方法来执行命令,这将返回一个 Process 对象。
  4. 通过 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 应用程序与更广泛的系统环境集成起来。

本站内容仅供学习和研究使用。