📜  运行其他应用程序的 java 应用程序 - Java (1)

📅  最后修改于: 2023-12-03 15:41:54.914000             🧑  作者: Mango

运行其他应用程序的 Java 应用程序

在 Java 应用程序中,需要执行其他应用程序时,可以使用 Runtime 类和 ProcessBuilder 类。这两个类提供了很多方法来启动外部进程,并与其进行交互。

使用 Runtime 类

Runtime 类是一个单例类,可以通过 Runtime.getRuntime() 方法获取该类的实例。通过 Runtime 类可以启动外部进程,例如:

try {
    Runtime.getRuntime().exec("notepad.exe");
} catch (IOException e) {
    e.printStackTrace();
}

上面的代码会在当前系统中启动记事本应用程序。

如果需要执行命令行程序,可以在参数中指定命令行参数,例如:

try {
    Runtime.getRuntime().exec("cmd /c echo hello");
} catch (IOException e) {
    e.printStackTrace();
}

上面的代码会在控制台输出 hello

Runtime 类提供了很多其他的方法,例如 addShutdownHook() 方法可以添加一个钩子程序,在 JVM 关闭时执行一些清理工作。

使用 ProcessBuilder 类

ProcessBuilder 类比 Runtime 类更加灵活,可以设置更多的参数来控制进程的启动和交互。例如,可以通过 command() 方法设置要运行的命令和参数,通过 directory() 方法设置工作目录,通过 environment() 方法设置环境变量,通过 redirectError()redirectInput() 方法设置错误输出和标准输入等。

下面是一个使用 ProcessBuilder 类来启动命令行程序并读取其输出的例子:

try {
    ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "dir");
    pb.redirectErrorStream(true);
    Process process = pb.start();
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

上面的代码会启动命令行程序并执行 dir 命令,然后读取其输出并打印到控制台。

注意事项

在使用 Runtime 类或 ProcessBuilder 类启动进程时,会受到系统安全限制的影响。某些操作系统可能会限制进程的执行权限,或者限制某些命令的执行。因此,在编写程序时需要格外小心,避免误操作导致系统出现问题。

此外,需要注意的是,使用 ProcessBuilder 类启动进程时,可能会出现阻塞情况。如果要避免这种情况,可以使用线程来启动进程,并在另一个线程中读取输出,从而避免阻塞主线程。