我在java代码中调用一个位于jar文件中的类(使用java -classpath path / file.jar classname)。
这项工作做得很好,但只有在命令形成良好的情况下。如果我弄错了 getRuntime()。exect(命令)就是什么都没说。 Bellow我有工作命令调用。我想在命令不起作用时收到错误消息。如果我在cmd(windows)中犯了一个错误,我会得到一个正确的错误,我可以解决它。但不在我的java应用程序中。
我留下了'if(input.ready())',因为如果我没有在命令行不正确时程序冻结。执行'input.readLine()'时会发生这种情况。
// Execute a command with an argument that contains a space
String[] genKOSCommand = new String[] {
"java",
"-classpath",
Config.XDSI_TEST_KIT_HOME + "/xdsitest/lib/xdsitest.jar;"
+ Config.XDSI_TEST_KIT_HOME + "/xdsitest/classes",
"ca.etsmtl.ihe.xdsitest.docsource.SimplePublisher", "-k",
"C:/Softmedical/Viewer_Test/xdsi-testkit-2.0.4/xdsihome/usr/data/image14.dcm" };
Process child = Runtime.getRuntime().exec(genKOSCommand);
BufferedReader input = new BufferedReader(new InputStreamReader(
child.getInputStream()), 13107200);
String line = null;
if (input.ready()) {
while ((line = input.readLine()) != null) {
System.out.println(line);
}
try {
child.waitFor();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
有关如何从执行的命令中获取错误的任何建议吗?
谢谢
答案 0 :(得分:4)
使用getErrorStream:
BufferedReader errinput = new BufferedReader(new InputStreamReader(
child.getErrorStream()));
当处理来自不同流的输入时,最好在不同的线程中进行(因为这些调用(readLine
等)是阻塞调用。
答案 1 :(得分:3)
通过进程/运行时运行一些command
,打印出收到的错误,这是一段更完整的代码:
final String command = "/bin/bash -c cat foo.txt | some.app";
Process p;
try {
p = Runtime.getRuntime().exec(command);
} catch (final IOException e) {
e.printStackTrace();
}
//Wait to get exit value
try {
p.waitFor();
final int exitValue = p.waitFor();
if (exitValue == 0)
System.out.println("Successfully executed the command: " + command);
else {
System.out.println("Failed to execute the following command: " + command + " due to the following error(s):");
try (final BufferedReader b = new BufferedReader(new InputStreamReader(p.getErrorStream()))) {
String line;
if ((line = b.readLine()) != null)
System.out.println(line);
} catch (final IOException e) {
e.printStackTrace();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
答案 2 :(得分:2)
Process.getErrorStream
不是你想要的吗?