2

如何用 Java 编写一个程序来执行另一个程序?此外,该程序的输入应该从我们的程序中给出,该程序的输出应该写入一个文件。

这是我获取其输出的一小部分代码:

Process p = Runtime.getRuntime().exec("C:\\j2sdk1.4.0\bin\\helloworld.java");
BufferedReader input =
        new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) 
  System.out.println(line);

input.close();

这是我的一组代码,但这会引发IOException.

4

5 回答 5

5

Java 为此提供的 API 是ProcessBuilder。设置工作目录和传递参数相对简单。

有点棘手的是传递 STDIN 并读取 STDERR 和 STDOUT,至少对于非平凡的大小,因为您需要启动单独的线程以确保清除相应的缓冲区。否则,您调用的应用程序可能会阻塞,直到它可以写入更多输出,并且如果您还等待该过程完成(不确保读取 STDOUT),您将死锁。

于 2009-01-21T08:51:43.290 回答
4

当你只想启动其他程序时,你可以像这样使用 exec 方法:

Runtime r = Runtime.getRuntime();
mStartProcess = r.exec(applicationName, null, fileToExecute);

StreamLogger outputGobbler = new StreamLogger(mStartProcess.getInputStream());
outputGobbler.start();

int returnCode = mStartProcess.waitFor();


class StreamLogger extends Thread{

   private InputStream mInputStream;

   public StreamLogger(InputStream is) {
        this.mInputStream = is;
    }

   public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(mInputStream);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {
                    System.out.println(line);
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

}

执行:

public Process exec(String command, String envp[], File dir) 



   @param      command   a specified system command.
   @param      envp      array of strings, each element of which 
                         has environment variable settings in format
                         <i>name</i>=<i>value</i>.
   @param      dir       the working directory of the subprocess, or
                         <tt>null</tt> if the subprocess should inherit
                         the working directory of the current process.
于 2009-01-21T09:23:44.707 回答
4

您可以使用java.lang.Processjava.lang.ProcessBuilder。您使用 getInputStream/getOutputStream/getErrorStream 与流程的输入/输出进行交互。

但是,有一个名为Exec的 Apache Commons 库,旨在使这一切变得更容易。(在引用命令行参数等时,它通常会变得很麻烦。)我自己没有使用过 Exec,但值得一试。

于 2009-01-21T08:49:59.673 回答
2

请不要编辑您的问题,使其不再符合原始答案。如果您有后续问题,请清楚地标记它们,或者将它们作为单独的问题提出,或者使用评论之类的。

至于你的 IOException,请给出它显示的错误信息。

此外,您似乎正在尝试直接运行“.java”文件。那不管用。此处描述的方法是启动本机二进制可执行文件。如果你想运行一个“.java”文件,你必须把它编译成一个类,然后调用那个类的方法。

于 2009-01-22T04:00:54.310 回答
1

你在哪个平台?

如果你在 *nix 上,你可以输入:

java我的程序| 我的外部程序 > myfilename.txt

于 2009-01-21T08:49:35.290 回答