在Java中启动进程?

jma*_*erx 32 java process

有没有办法在Java中启动进程?在.Net这可以通过以下方式完成:

System.Diagnostics.Process.Start("processname");
Run Code Online (Sandbox Code Playgroud)

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

Jam*_* P. 32

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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请注意,您应该使用方法的`.exec(String [])`形式,而不是单个字符串`.exec(String)`形式,*不是命令行处理器* - 它只是在空格上分割.它们为这个例子`tree.com/A`提供了相同的结果,但是如果给出它们则是不同的,例如,在其中有空格的文件名. (8认同)
  • 您还应该刷新错误流,并在必要时等待进程输出值. (2认同)

Nul*_*ion 22

看到Runtime.exec()Process上课.最简单的形式:

Process myProcess = Runtime.getRuntime().exec(command);
...
Run Code Online (Sandbox Code Playgroud)

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

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

Process myProcess = new ProcessBuilder(command, arg).start();
...
Run Code Online (Sandbox Code Playgroud)


Fel*_*old 16

Java类库表示使用java.lang.Process该类的外部进程.可以使用以下方法生成进程java.lang.ProcessBuilder:

Process process = new ProcessBuilder("processname").start();
Run Code Online (Sandbox Code Playgroud)

或者由类exec上的重载方法公开的旧接口java.lang.Runtime:

Process process = Runtime.getRuntime().exec("processname");
Run Code Online (Sandbox Code Playgroud)

这两个代码片段都将生成一个新进程,该进程通常以异步方式执行,并可通过生成的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();
Run Code Online (Sandbox Code Playgroud)

jproc 可以通过maven central获得:

<dependency>
      <groupId>org.buildobjects</groupId>
      <artifactId>jproc</artifactId>
      <version>2.2.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)