4

我正在从我的应用程序内部执行 Java 类。

proc = Runtime.getRuntime().exec("java Test");

如何识别是否Test执行成功(即没有例外)?


重定向输出/错误:

proc = Runtime.getRuntime().exec(new String[] {
    "java",
    mclass,
    ">NUL 2>test.txt"
});

来自cmd

java Main >NUL 2>test.txt
4

6 回答 6

7
process.waitFor();
int exitCode = process.exitValue();
if(exitCode == 0) { // success }
else { // failed }

如果Test设计正确并返回适当的退出代码(通常,如果出现问题,则 >0),则此方法有效。

如果您想获取Test输出/错误消息以确定出了什么问题,您应该获取proc.getInputStream()(这将返回子进程的输出流),proc.getErrorStream()并从单独线程中的输入流中读取。

请注意,如果子进程写入错误/输出流并且没有读取器,它将被阻塞。因此,在任何情况下,读取进程的错误/输出流都是有用的。

避免子阻塞的另一个选项是将其错误/输出重定向到文件和/或/dev/null(Windows 的“NUL”):

Runtime.exec("java Test >/dev/null 2>&1");
Runtime.exec("java Test >/dev/null 2>erroroutput");
于 2010-12-05T09:51:04.150 回答
2

重定向是由 shell 处理器完成的,而不是由Runtime.exec()(至少不是在 Windows 上)。
您需要通过以下方式执行命令cmd.exe

String command = "cmd /c java -classpath D:\\dev\\temp\\ Main >NUL 2>test.txt";
proc = Runtime.getRuntime().exec(command);
于 2010-12-05T16:30:50.647 回答
1

参见流程类

您可以调用proc.waitFor()以返回一个整数值。但是您必须确保正确处理程序的所有输出(例如使用proc.getInputStream()方法)。

于 2010-12-05T09:48:25.530 回答
1

你试过proc.exitValue()吗?

于 2010-12-05T09:51:46.337 回答
0

您可以使用 Java 的 ProcessBuilder 类来执行这些文件。

于 2015-02-16T08:57:17.377 回答
0

呃……什么?这样做:

int response = (int)(getClass().getClassLoader().findClass("Test").
        getMethod("someStaticMethod", new String[]{}).
        invoke(null, new Object[]{}));

这会调用动态加载的“Test”类的静态方法“int someStaticMethod()”。

于 2010-12-05T09:45:29.623 回答