在 Java 中启动进程?

2022-09-01 04:14:07

有没有办法在Java中启动一个进程?在 .Net 中,例如:

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

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


答案 1

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


答案 2

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,如 Process 类的文档中所述(着重号是后加的):

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

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

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

jproc可通过 maven central 获得:

<dependency>
      <groupId>org.buildobjects</groupId>
      <artifactId>jproc</artifactId>
      <version>2.5.1</version>
</dependency>

推荐