Process p = Runtime.getRuntime().exec("javac Test.java");
Process q = Runtime.getRuntime().exec("java Test");
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(q.getInputStream()));
String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
这不起作用......也不会返回错误和输出。 另外,我想问一下什么是更好的流程或流程构建者
答案 0 :(得分:1)
您的代码同时启动javac
和java
进程。当然,如果javac
进程仍然有效,则不应尝试对其结果运行java
。
因此,您应该在创建流程p.waitFor()
之前将q
放在之前,并且只有在流程q
成功时才创建流程p
。
要知道p
是否成功,您应该在waitFor()
之后检查流程的返回代码:
int exitVal = p.exitValue();
如果不为零,您可以通过阅读错误流来检查错误。目前,您正在尝试获取输入流(这是进程的输出流)。但错误会打印到错误流中(就像在自己的程序中使用System.err.println()
一样)。为此,您需要拨打p.getErrorStream()
而不是p.getInputStream()
,然后阅读并打印。
如果exitVal
为零,并且只有那时,您可以创建另一个进程,因为您知道编译成功并且您有一个等待运行的.class
文件。
答案 1 :(得分:0)
除了RealSkeptics的回答,您可能还想看看JDK附带的tools.jar。它包含一个可以直接调用的javac版本,因此更容易调试。
还有其他运行时编译器。例如Eclipse附带的那个。