在Java中启动进程?

时间:2010-09-22 23:40:31

标签: java process

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

来完成
System.Diagnostics.Process.Start("processname");

Java中是否存在等效项,因此我可以让用户找到该应用程序,然后它可以用于任何操作系统?

3 个答案:

答案 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>