从我们的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的 – 如何打印出一个完整的堆栈跟踪?