0

我在运行时使用 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 运行 abcClass,并使用以下选项:-x、jar 应用程序内的 fileGram、-o、GIFdir 目录、-d、xyz、-v。我在命令控制台中得到完整的输出,但在 jar 应用程序中使用进程构建器时只有部分输出,为什么会发生这种情况,请帮助我!!!

4

1 回答 1

0

如果没有更多细节,这个问题很难回答。警告:根据我的经验,使用ProcessBuilder起来Process可能很棘手。总是潜伏着一个角落里的案例......

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

好的。使用以下命令在命令行再次运行两次:

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

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

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

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;
}
于 2013-07-06T02:28:06.050 回答