从我们的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.out和Standard.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(); } } 
 然后你需要将这个类绑定到相应的InputStream和OutputStream对象中。 
  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()时,这几乎是我使用的锅炉板。 
 更高级的方法是使用FutureTask和Callable或者至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
- 为什么在Java中没有多重inheritance,但是允许实现多个接口?
- 在双向JPA OneToMany / ManyToOne关联中,“关联的反面”是什么意思?
- 在jar中更新.class文件
- javac错误:只有在明确请求注解处理的情况下,类名才被接受
- 在Java KeyStore中导入私钥/公钥证书对
- 线程“main”中的exceptionjava.lang.NoClassDefFoundError:junit / textui / ResultPrinter
- Gradle – 获取依赖项的最新版本
- 在Java中将列表转换为集合最简单的方法
- Java / Android的 – 如何打印出一个完整的堆栈跟踪?