有没有办法在Java中启动进程?在.Net中这可以通过例如:
来完成System.Diagnostics.Process.Start("processname");
Java中是否存在等效项,因此我可以让用户找到该应用程序,然后它可以用于任何操作系统?
答案 0 :(得分:29)
http://www.rgagnon.com/javadetails/java-0014.html
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.file.Paths;
public class CmdExec {
public static void main(String args[]) {
try {
// enter code here
Process p = Runtime.getRuntime().exec(
Paths.get(System.getenv("windir"), "system32", "tree.com /A").toString()
);
// enter code here
try(BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
String line;
while ((line = input.readLine()) != null) {
System.out.println(line);
}
}
} catch (Exception err) {
err.printStackTrace();
}
}
}
您可以使用系统属性或类似方法获取本地路径。
http://download.oracle.com/javase/tutorial/essential/environment/sysprop.html
答案 1 :(得分:22)
请参阅Runtime.exec()
和Process
课程。最简单的形式:
Process myProcess = Runtime.getRuntime().exec(command);
...
请注意,您还需要读取进程的输出(例如:myProcess.getInputStream()
) - 否则进程将在某些系统上挂起。这可能是第一次非常混乱,应该包含在这些API的任何介绍中。请参阅James P.的回答。
您可能还想查看新的ProcessBuilder
类,这样可以更轻松地更改环境变量并调用子进程:
Process myProcess = new ProcessBuilder(command, arg).start();
...
答案 2 :(得分:14)
Java类库使用java.lang.Process
类表示外部进程。可以使用java.lang.ProcessBuilder
:
Process process = new ProcessBuilder("processname").start();
或java.lang.Runtime
类上重载的exec
方法公开的旧界面:
Process process = Runtime.getRuntime().exec("processname");
这两个代码片段都将生成一个新进程,该进程通常异步执行,并可通过生成的Process
对象进行交互。如果您需要检查进程是否已完成(或等待它完成),请不要忘记检查process.exitValue()
或process.waitFor()
返回的退出值(退出代码)是否符合预期(大多数程序都为0,因为如果进程异常退出,则不会抛出异常。
另请注意,通常需要额外的代码来正确处理进程的I / O,如documentation for the Process
class中所述(强调添加):
默认情况下,创建的子进程没有自己的终端或控制台。它的所有标准I / O(即stdin,stdout,stderr)操作将被重定向到父进程,在那里可以通过使用方法getOutputStream(),getInputStream()和getErrorStream()获得的流来访问它们。父进程使用这些流向子进程提供输入并从子进程获取输出。由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,无法及时写入输入流或读取子进程的输出流可能导致子进程阻塞,甚至死锁。 / p>
确保正确处理I / O并且退出值表示成功的一种方法是使用像jproc
这样的库来处理捕获stdout和stderr的复杂性,并提供简单的同步接口运行外部流程:
ProcResult result = new ProcBuilder("processname").run();
jproc
可通过maven central获取:
<dependency>
<groupId>org.buildobjects</groupId>
<artifactId>jproc</artifactId>
<version>2.2.0</version>
</dependency>