在Java中启动进程?

有没有办法在Java中启动进程? 在.Net这可以通过例如:

System.Diagnostics.Process.Start("processname"); 

在Java中是否存在等价物,以便我可以让用户找到应用程序然后它适用于任何操作系统?

http://www.rgagnon.com/javadetails/java-0014.html

 import java.io.*; public class CmdExec { public static void main(String args[]) { try { String line; Process p = Runtime.getRuntime().exec (System.getenv("windir") +"\\system32\\"+"tree.com /A"); BufferedReader input = new BufferedReader (new InputStreamReader(p.getInputStream())); while ((line = input.readLine()) != null) { System.out.println(line); } input.close(); } catch (Exception err) { err.printStackTrace(); } } } 

您可以使用系统属性或类似方法获取本地路径。

http://download.oracle.com/javase/tutorial/essential/environment/sysprop.html

请参见Runtime.exec()Process类。 最简单的forms:

 Process myProcess = Runtime.getRuntime().exec(command); ... 

请注意,您还需要读取进程的输出(例如: myProcess.getInputStream() ) – 否则进程将在某些系统上挂起。 这可能是第一次非常混乱,应该包含在这些API的任何介绍中。 请参阅James P.的回答。

您可能还想查看新的ProcessBuilder类,这样可以更轻松地更改环境变量并调用子进程:

 Process myProcess = new ProcessBuilder(command, arg).start(); ... 

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()返回的退出值(退出代码process.waitFor()是否符合预期(大多数程序都为0,因为如果进程exception退出,则不会抛出exception。

另请注意,通常需要额外的代码来正确处理进程的I / O,如Process类的文档中所述 (强调添加):

默认情况下,创建的子进程没有自己的终端或控制台。 它的所有标准I / O(即stdin,stdout,stderr)操作将被重定向到父进程,在那里可以通过使用方法getOutputStream(),getInputStream()和getErrorStream()获得的流来访问它们。 父进程使用这些流向子进程提供输入并从子进程获取输出。 由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此无法及时写入输入流或读取子进程的输出流可能导致子进程阻塞甚至死锁

确保正确处理I / O并且退出值表示成功的一种方法是使用像jproc这样的库来处理捕获stdout和stderr的复杂性,并提供一个简单的同步接口来运行外部进程:

 ProcResult result = new ProcBuilder("processname").run(); 

jproc可通过maven central获得:

  org.buildobjects jproc 2.2.0  

这是逻辑。 假设我们想在Windows中使用java运行计算器:

 Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "calc.exe");