我们的Java程序的外部程序

时间:2009-01-21 08:46:43

标签: java process exec

如何用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

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

然而,有一个名为Exec的Apache Commons库,旨在使所有这些更容易。 (在引用命令行参数等时,它通常会变得非常毛茸茸。)我自己没有使用过Exec,但值得一试。

答案 2 :(得分: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();
        }
    }

}

EXEC:

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.

答案 3 :(得分:2)

请不要编辑您的问题,使其不再符合原始答案。 如果您有后续问题,请明确标记,或将其作为单独的问题,或使用评论或其他内容。

关于您的IOException,请提供它显示的错误消息。

此外,您似乎正在尝试直接运行“.java”文件。那样不行。这里描述的方法是启动本机二进制可执行文件。如果要运行“.java”文件,则必须将其编译为类,并调用类“ main 方法。

答案 4 :(得分:1)

你在哪个平台?

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

java MyProgram | myexternalprogram&gt; myfilename.txt