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

Java 在运行时运行ProcessBuilder,仅获取BufferStreamReader的一部分,java,process,processbuilder,Java,Process,Processbuilder,我在运行时使用ProcessBuilder在另一个jar中运行jar文件时遇到了问题,问题是,我只得到流输出的一部分,这里是我代码的一部分 String[] command = { "java","-cp",fileJar.getAbsolutePath(), "a.b.c.Class","-x",fileGram.getAbsolutePath(), "-o",GIFdir.getAbsolutePa

我在运行时使用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应用程序中的fileGram,-o,GIFdir目录,-d,xyz,-v。我在命令控制台中获得了完整的输出,但在jar应用程序中使用process builder时,只有部分输出,为什么会发生这种情况,请帮助我

如果没有更多细节,这个问题很难回答。警告:根据我的经验,
ProcessBuilder
Process
很难很好地使用。总是一个角落的案件潜伏着

1) 您可以说:在控制台上运行命令很好而且很顺利

嗯。使用此命令在命令行中再次运行两次:

  • jarxyz1>stdout.txt
  • jarxyz2>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;
}

部分输出是否可以发送到stderr?有两个输出流—一个用于标准输出,一个用于错误输出—你们的意思是有两个输出流,在控制台上运行命令很好,很流畅,但在应用程序中并没有,我只得到了部分输出,为什么?他的意思是有两个流。请参阅ProcessBuilderJavadoc。一个输出流和一个错误流。是的,你们都是对的,我在让fileGram.getAbsolutePath()运行时出错了,在我使用getErrorStream检查之后,谢谢大家,你们是最好的。