答案 0 :(得分:4)
问题尚不清楚,但我认为其他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);
}
当我需要Runtime.exec()
Java中的任何内容时,这几乎就是我使用的样板。
更高级的方法是使用FutureTask
和Callable
或至少Runnable
,而不是直接扩展Thread
,这不是最佳做法。
注意:强>
@Nonnull
注释位于JSR305库中。如果您正在使用Maven,并且您使用Maven不是您,只需将此依赖项添加到pom.xml
。
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>1.3.9</version>
</dependency>
答案 1 :(得分:2)
调用其他程序的main
方法(或其他程序中的入口点)
或使用ProcessBuilder
答案 2 :(得分:-1)
如果其他java程序是可执行程序,您可以使用如下代码:
try
{
Runtime.getRuntime().exec("C:\\my.exe");
}
catch(IOException ex)
{ }