我在运行时使用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应用程序中使用流程构建器仅输出部分,为什么会发生这种情况,请帮助我!!!
答案 0 :(得分:0)
如果没有更多细节,这个问题很难回答。警告:根据我的经验,ProcessBuilder
和Process
可能很难使用。总是一个潜伏的角落......
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;
}