📅  最后修改于: 2023-12-03 15:41:54.914000             🧑  作者: Mango
在 Java 应用程序中,需要执行其他应用程序时,可以使用 Runtime
类和 ProcessBuilder
类。这两个类提供了很多方法来启动外部进程,并与其进行交互。
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
类比 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
类启动进程时,可能会出现阻塞情况。如果要避免这种情况,可以使用线程来启动进程,并在另一个线程中读取输出,从而避免阻塞主线程。