如何使用javas Process.waitFor()?

如何使用javas Process.waitFor()?,java,shellexecute,java-io,Java,Shellexecute,Java Io,我正在尝试从Java运行命令行命令,一次快速的健全性检查让我意识到我遇到问题的原因是我无法让下面的pr.waitFor()调用正常工作。此程序在30秒内结束,在“foo:”之后不打印任何内容。我预计只需要30秒,然后在“foo:”后面打印一个随机数。我做错了什么 import java.io.BufferedReader; import java.io.InputStreamReader; public class Sample { public static void main(S

我正在尝试从Java运行命令行命令,一次快速的健全性检查让我意识到我遇到问题的原因是我无法让下面的
pr.waitFor()
调用正常工作。此程序在30秒内结束,在“foo:”之后不打印任何内容。我预计只需要30秒,然后在“foo:”后面打印一个随机数。我做错了什么

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Sample {

    public static void main(String[] args) throws Exception {
        Runtime rt = Runtime.getRuntime();
        Process pr = rt.exec("sleep 32; echo $RANDOM");
        pr.waitFor();

        BufferedReader input = new BufferedReader(
                                   new InputStreamReader(pr.getInputStream()));
        String line=null;

        StringBuilder s = new StringBuilder();
        while((line=input.readLine()) != null) {
            System.out.println(s);
            s.append(line);
        }
        System.out.println("foo: " + s.toString());
    }
}

您正在尝试执行shell命令。你应该试着执行一个程序


如Femi的回答所示,您可以调用bash作为可执行文件,然后将参数传递给它,让bash执行sleep和echo命令。

您正在尝试执行shell命令。你应该试着执行一个程序

如Femi的回答所示,您可以调用bash作为可执行文件,然后向其传递参数,让bash执行sleep和echo命令。

您应该尝试以下方法:

Process pr = rt.exec(new String[]{ "bash","-c", "sleep 32; echo $RANDOM" });
这将启动一个shell进程,然后在shell中运行您的命令。命令完成后,shell才会返回

让我知道这是否适合您。

您应该尝试以下方法:

Process pr = rt.exec(new String[]{ "bash","-c", "sleep 32; echo $RANDOM" });
这将启动一个shell进程,然后在shell中运行您的命令。命令完成后,shell才会返回

让我知道这是否对您有效。

阻塞当前线程,直到进程终止,此时执行控制返回到生成进程的线程

在发布的代码中,一旦流程终止(即,在process.waitFor调用之后),现在终止的流程的输入流不再具有任何可以读取的数据。因此,读取流的内容并将其打印出来不会产生任何有形的输入

如果需要读取流的内容,则需要生成一个新线程,在子进程终止之前,该线程将根据需要负责读取输入流和写入输出流的必要活动

也可以在同一线程中执行读写操作,但在等待子进程终止之前。换句话说,您需要切换包含
pr.waitFor()的行的序列和从InputStream读取的行

关于SO的相关问题:

  • 阻止当前线程,直到进程终止,此时执行控制返回到生成进程的线程

    在发布的代码中,一旦流程终止(即,在process.waitFor调用之后),现在终止的流程的输入流不再具有任何可以读取的数据。因此,读取流的内容并将其打印出来不会产生任何有形的输入

    如果需要读取流的内容,则需要生成一个新线程,在子进程终止之前,该线程将根据需要负责读取输入流和写入输出流的必要活动

    也可以在同一线程中执行读写操作,但在等待子进程终止之前。换句话说,您需要切换包含
    pr.waitFor()的行的序列和从InputStream读取的行

    关于SO的相关问题:


  • 嗯,你能把你的答案再延长一点吗?我该怎么做?另外,sleep和echo是shell命令,不是吗?@jonalv肯定我会编辑它。基本上,exec不调用shell,而是调用一个可执行文件。如果要执行shell命令,则需要调用shell并将要执行的命令传递给它。Femi的回答向您展示了如何调用shell bash并执行sleep和echo。嗯,您能稍微扩展一下您的回答吗?我该怎么做?另外,sleep和echo是shell命令,不是吗?@jonalv肯定我会编辑它。基本上,exec不调用shell,而是调用一个可执行文件。如果要执行shell命令,则需要调用shell并将要执行的命令传递给它。Femi的回答向您展示了如何调用shell bash并执行sleep和echo。