【问题标题】:handling c executable file using java使用java处理c可执行文件
【发布时间】:2011-03-27 02:31:33
【问题描述】:

我想用java运行一个C/C++程序的exe文件......并处理它的输入和输出......

我的代码是

import java.io.*;

class run2 {
  public static void main(String[] args) throws java.io.IOException {

    String[] command = new String[3];
    command[0] = "cmd";
    command[1] = "/C";
    // command[2] = "java Run1";
    command[2] = "start C:\\WE.EXE";

    Process p = Runtime.getRuntime().exec(command);
    String i = "20";

    BufferedReader stdInput = new BufferedReader(new InputStreamReader(
        p.getInputStream()));
    BufferedWriter st = new BufferedWriter(new OutputStreamWriter(
        p.getOutputStream()));

    String s = null;
    System.out.println("Here is the standard output of the command:\n");
    s = stdInput.readLine();
    System.out.println(s);
    st.write(i);
    st.newLine();
    st.flush();
    while ((s = stdInput.readLine()) != null) {
      System.out.println("Stdout: " + s);
    }

    try {
      System.out.println("Exit status = " + p.waitFor());
    }
    catch (InterruptedException e) {
    }
    stdInput.close();
   }
}

我收到一条错误消息,提示管道已关闭 帮帮我.....

【问题讨论】:

  • 请在回溯和所有内容中包含完整的错误

标签: java process exec runtime.exec


【解决方案1】:

首先,如果C:/ 中没有WE.EXE,那可能是个问题。如果没有进程启动,当然你不能用它的输入/输出管道做任何事情。

但是,假设您有 WE.EXE,您的错误可能在:

st.flush();

您的应用程序正在命令提示符或 cmd.exe 中打开 WE.EXE,它将同时处理标准输入和标准输出。您的调用stdInput.readLine(); 将等到WE.EXE,因此cmd.exe 终止,此时输出流将被关闭(您显然无法写入已关闭的管道)。

所以如果你想自己处理输入和输出,你应该直接启动WE.exe,比如:

Process p = Runtime.getRuntime().exec("C://WE.EXE");

此外,您可以考虑使用ProcessBuilder 而不是Runtime.exec


小细节,但考虑使用Java's naming conventions--例如,您的类名将是 Run2(或更具描述性的名称)而不是 run2。

【讨论】:

    【解决方案2】:

    您正在尝试从尚不存在的流 (stdInput) 中读取。 在 WE.EXE 程序向其写入内容之前,它不会存在。

    等到您将命令发送到程序。 也就是说,取出第一行输入,就可以正常工作了。

    //s = stdInput.readLine(); System.out.println(s); st.write(i); st.newLine(); st.flush(); 而 ((s = stdInput.readLine()) != null) { System.out.println("标准输出:" + s); }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多