从我们的Java程序执行另一个Java程序

可能重复:
从我们的Java程序执行一个Java程序

我想从我们的Java程序执行另一个Java程序。 当我运行一个名为“First.java”的Java程序时,它应该提示用户input任何类名(.java文件名)的名称,然后它应该读取该input(.java文件),并且应该能够编译并运行该程序。任何人都可以给我一个示例代码?

如果其他Java程序是一个可执行程序,你可以使用这样的代码:

  try { Runtime.getRuntime().exec("C:\\my.exe"); } catch(IOException ex) { } 

目前还不清楚这个问题,但我会假定其他的Java程序是一个命令行程序。

如果是这种情况,您可以使用Runtime.exec()

这不是那么简单,如果你想看看该程序的输出是什么。 下面是你将如何使用Runtime.exec()与任何外部程序,而不仅仅是一个Java程序。

首先,你需要一个非阻塞的方式来读取Standard.outStandard.err

 private class ProcessResultReader extends Thread { final InputStream is; final String type; final StringBuilder sb; ProcessResultReader(@Nonnull final InputStream is, @Nonnull String type) { this.is = is; this.type = type; this.sb = new StringBuilder(); } public void run() { try { final InputStreamReader isr = new InputStreamReader(is); final BufferedReader br = new BufferedReader(isr); String line = null; while ((line = br.readLine()) != null) { this.sb.append(line).append("\n"); } } catch (final IOException ioe) { System.err.println(ioe.getMessage()); throw new RuntimeException(ioe); } } @Override public String toString() { return this.sb.toString(); } } 

然后你需要将这个类绑定到相应的InputStreamOutputStream对象中。

  try { final Process p = Runtime.getRuntime().exec(String.format("cmd /c %s", query)); final ProcessResultReader stderr = new ProcessResultReader(p.getErrorStream(), "STDERR"); final ProcessResultReader stdout = new ProcessResultReader(p.getInputStream(), "STDOUT"); stderr.start(); stdout.start(); final int exitValue = p.waitFor(); if (exitValue == 0) { System.out.print(stdout.toString()); } else { System.err.print(stderr.toString()); } } catch (final IOException e) { throw new RuntimeException(e); } catch (final InterruptedException e) { throw new RuntimeException(e); } 

当我需要Java中的Runtime.exec()时,这几乎是我使用的锅炉板。

更高级的方法是使用FutureTaskCallable或者至lessRunnable而不是直接扩展Thread ,这不是最好的做法。

注意:

@Nonnull注释位于JSR305库中。 如果您正在使用Maven,并且您正在使用Maven,那么只需将此依赖项添加到您的pom.xml

 <dependency> <groupId>com.google.code.findbugs</groupId> <artifactId>jsr305</artifactId> <version>1.3.9</version> </dependency> 
  • 调用其他程序的main方法(或者其他程序中的入口点)

  • 或者使用ProcessBuilder