检索ProcessBuilder的输出

时间:2014-04-02 07:10:03

标签: java process stream

说我有这样的功能:

public String runCommand(parameters, boolean interactive)
{
    Process p = null;

    // some code

    try
    {
        final ProcessBuilder pb = new ProcessBuilder(my_command);
        pb.inheritIO(); // So the output is displayed on the console
        p = pb.start();
        p.waitFor();
    }
    catch( IOException | InterruptedException e )
    {
        e.printStackTrace();
    }

    if (interactive )
    {
        return p.exitValue() + "";
    }
    else
    {
        // return the stdout of the process p
    }
}

我要做的是,只有当ProcessBuilder布尔设置为interactive时,才会返回我正在false运行的流程的标准输出。但是,我无法想象如何将标准输出重定向到ProcessBuilder的变量。请注意,我使用了inheritIO(),所以当我使用像adb shell这样的函数时,shell会显示在我的控制台中,这就是我想要的行为。所以基本上,就像现在一样,我可以看到控制台中的标准输出,但我不知道如何在函数中返回它,所以我可以将这个值用作未来东西的变量。

2 个答案:

答案 0 :(得分:0)

试试这个

    Process p = new ProcessBuilder(cmd).start();
    Reader rdr = new InputStreamReader(p.getInputStream());
    StringBuilder sb = new StringBuilder();
    for(int i; (i = rdr.read()) !=-1;) {
        sb.append((char)i);
    }
    String var = sb.toString();

答案 1 :(得分:0)

您可以做的是在执行时获取输出,如下所示:

pb.redirectErrorStream(true);

    Process p;
    try {
        p = pb.start();

        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        String output = "";
        while((line = in.readLine()) != null) {
            log.info(line);
            output += line + "\n";
        }
        return output;
    } catch (IOException e) {
        // ...
    }
    return null;