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

时间:2011-10-14 15:43:18

标签: java

3 个答案:

答案 0 :(得分:4)

问题尚不清楚,但我认为其他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);
    }

当我需要Runtime.exec() Java中的任何内容时,这几乎就是我使用的样板。

更高级的方法是使用FutureTaskCallable或至少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) 
    { }