java - 如何在 Java 进程中等待子进程完成?

标签 java shell command-line cmd

这基本上就是我想要做的:我创建了一个模拟命令行的Process。像这样:

private Process getProcess() {
    ProcessBuilder builder = new ProcessBuilder("C:/Windows/System32/cmd.exe");
    Process p = null;
    try {
        p = builder.start();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    return p;
} 

现在我可以用命令“喂养”这个过程:

BufferedWriter p_stdin = new BufferedWriter(
    new OutputStreamWriter(process.getOutputStream()));
try {
            p_stdin.write("dir"); // Just a sample command
            p_stdin.newLine();
            p_stdin.flush();
        } catch (IOException e) {
            e.printStackTrace();
            return "Failed to run " + fileName;
        }

我现在想做的是等待命令(这是我的进程的子进程)完成。我怎样才能做到这一点?我知道我可以使用 waitFor() 方法等待进程,但是子进程呢?

最佳答案

dir 命令不是子进程,它在 cmd 内部执行。然而,无论如何,这并没有多大关系:从 Java 的角度来看,在子进程中启动的任何其他命令都会表现相同。

要等待 dir 命令完成,您必须解释从 cmd 传入的 stdout 输出,并了解何时再次打印提示。不过,这是一个相当脆弱的机制。

无论如何,您目前根本不使用 cmd 的 stdout,这将导致它很快阻塞,并且永远无法恢复。

关于java - 如何在 Java 进程中等待子进程完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18893075/

相关文章:

java - 如何在 Spring 中将两个 ApplicationContext 合并到另一个?

Java jar 在 maven 资源文件夹中找不到文件

linux - sh shell 中数组中的命令输出

shell - 使用 hadoop -fs shell 重用 hadoop 连接

java - 如何在phonegap android中隐藏推送通知栏

使用服务加载器加载的Java服务使用服务加载器加载自己的服务

linux - 两个模式之间的 Awk,中间有模式

R: RScript Vector 作为参数

c++ - gcc 指定任何软件异常的命令行选项可能会保留使用 'throw()' 声明的函数

windows - 传递包含连字符的命令行参数