我已经拥有可以处理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, 而且我没有得到一些输出,所以这是我的问题..
答案 0 :(得分:0)
您可以将InputStreamReader
与BufferedReader
结合使用来获取命令的输出:
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!