如何捕获Java中的所有Bash输出

时间:2015-02-20 21:57:58

标签: java linux bash gradle

我已经拥有可以处理stdout所有输出的Java代码 和stderr,一切正常。它使用getInputStream()和 getErrorStream();

如果我在Bash终端输入这样的命令:

export ANDROID_HOME=/usr/local/bin/android-sdk-linux;export PATH=${PATH}:/usr/local/bin/gradle-1.8/bin;cd /var/local/android/dev/GradleHelloWorld;gradle clean

它得到额外的输出,如:

> Loading

>Loading Resolving dependencies ...

>Building

直到获得常规的“结束”输出:

:clean UP-TO-DATE

BUILD SUCCESSFUL

Total time: 2 mins 37.424 secs

但在尝试了下面的许多不同组合后, 有没有“-c”:

processBuilder = new ProcessBuilder("bash", "-c", sCmd);

proc = rt.exec(new String[] {"/bin/bash", "-c", commandS});

我知道那几乎是一样的,但你明白了。 它只显示“结束”结果,而不显示任何其他输出 在它之前。

对于Windows,我可以使用以下方式获得所有输出:

proc = rt.exec("cmd.exe");

和命令字符串。

我对Bash的了解不多,所以我可以尝试其他任何选项,还是可以使用不同的Java语句尝试使用Java捕获所有输出?

更新

我已经这样做了(大部分代码):

while ( true )
{

    if ( error_is.available() > 0 ) // Check Error Stream..
    {
        iBytesRead = error_is.read(tempBuf, 0, iTmpLength);
        if ( iBytesRead == -1 )
        {
             break;
        }

        baos.write(tempBuf, 0, iBytesRead);
   }
   else if ( out_is.available() > 0 )   // Check Output Stream..
   {
        iBytesRead = out_is.read(tempBuf, 0, iTmpLength);
        if ( iBytesRead == -1 )
        {
            break;
        }

        baos.write(tempBuf, 0, iBytesRead);
   }
}

使用cmd.exe在Windows中运行正常,所以我知道它有效, 它获得了一切,但对于Linux用户,我必须使用Bash, 而且我没有得到一些输出,所以这是我的问题..

1 个答案:

答案 0 :(得分:0)

您可以将InputStreamReaderBufferedReader结合使用来获取命令的输出:

    ProcessBuilder pb = new ProcessBuilder("your-command");
    Process p = pb.start();
    InputStreamReader isr = new InputStreamReader(p.getInputStream());
    BufferedReader br = new BufferedReader(isr);

    String lineRead;
    while ((lineRead = br.readLine()) != null) {
        LOGGER.info(lineRead);
    }
    int rc = p.waitFor();
    return rc; // successful return code should be zero!