【问题标题】:External program from our Java program我们 Java 程序的外部程序
【发布时间】:2009-01-21 08:46:42
【问题描述】:

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

【问题讨论】:

  • 只是好奇...“**”是什么意思?

标签: java process exec


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      当你只想启动其他程序时,可以这样使用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.
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          你在哪个平台?

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

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

          【讨论】:

            猜你喜欢
            • 2011-09-14
            • 2011-09-08
            • 2014-10-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-20
            • 2010-10-31
            • 2018-01-17
            相关资源
            最近更新 更多