在运行时运行ProcessBuilder,只获取BufferStreamReader的一部分

时间:2013-07-06 01:40:16

标签: java process processbuilder

我在运行时使用ProcessBuilder在其他jar中运行jar文件时遇到问题,问题是,我只获得了部分流输出,这里是我代码的一部分

String[] command = {  "java","-cp",fileJar.getAbsolutePath(),
                     "a.b.c.Class","-x",fileGram.getAbsolutePath(),   
                      "-o",GIFdir.getAbsolutePath(),"/","-d","xzf","-ver"};
ProcessBuilder probuilder = new ProcessBuilder( command );
pbaw = probuilder.start();
try {
  String line;
  BufferedReader input = new BufferedReader(new     
  InputStreamReader(pbaw.getInputStream()));
  while ((line = input.readLine()) != null) {
    System.out.println(line); 
  }
  input.close();
  pbaw.waitFor();
} catch (InterruptedException e) {
 e.printStackTrace();
}

在commad中我的意思是,从jar应用程序中的fileJar运行a.b.c.Class,选项为:-x,jar app中的fileGram,-o,GIFdir目录,-d,xyz,-v。我在命令控制台中获得完整输出,但在jar应用程序中使用流程构建器仅输出部分,为什么会发生这种情况,请帮助我!!!

1 个答案:

答案 0 :(得分:0)

如果没有更多细节,这个问题很难回答。警告:根据我的经验,ProcessBuilderProcess可能很难使用。总是一个潜伏的角落......

1)你说:在控制台上运行命令很好而且流畅

确定。使用以下命令在命令行再次运行:

  • jar x y z 1> stdout.txt
  • jar x y z 2> stderr.txt

你能确认stderr.txt是零字节吗? 理想情况下,您应该“粘贴”这两个文件并在此问题中提供。

2)尝试通过Process.getErrorStream()读取STDERR中的所有字节。

3)最后,尝试从STDOUT和STDERR读取字节而不是字符。

...
{
    ...
    String stdout = readInputStream(process.getInputStream());
    String stderr = readInputStream(process.getErrorStream());
    ...
}
...

public static String readInputStream(InputStream inputStream) {
    StringBuilder sb = new StringBuilder();
    byte[] buffer = new byte[8192];
    Charset cs = Charset.defaultCharset();  // or something different
    while (true) {
        int readCount = inputStream.read(buffer);
        if (-1 == readCount) {
            break;
        }
        String x = new String(buffer, 0, readCount, cs);
        sb.append(x);
    }
    String y = sb.toString();
    return y;
}