обработка исполняемого файла c использованием Java - PullRequest
0 голосов
/ 27 марта 2011

Я хочу запустить exe-файл программы на C / C ++ с использованием Java ....... и обработать его ввод и вывод ......

мой код

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();
   }
}

я получаю ошибку, которая говорит, что трубы закрыты помогите мне .....

Ответы [ 2 ]

0 голосов
/ 27 марта 2011

Вы пытаетесь читать из потока (stdInput), который еще не существует. Он не будет существовать до тех пор, пока программа WE.EXE не напишет в него что-либо.

Просто подождите, пока вы не отправите команды в программу. Другими словами, выньте первую строку ввода, и она будет работать нормально.

//s = stdInput.readLine(); 
System.out.println(s);
st.write(i); 
st.newLine();
st.flush();
while ((s = stdInput.readLine()) != null)
 {  System.out.println("Stdout: " + s);  }
0 голосов
/ 27 марта 2011

Ну, во-первых, если в C:/ нет WE.EXE, это может быть проблемой.Если ни один процесс не запущен, конечно, вы ничего не можете сделать с его каналами ввода / вывода.

Однако, если у вас есть WE.EXE, ваша ошибка, вероятно, равна:

st.flush();

Ваше приложение открывается WE.EXE в командной строке или cmd.exe, который позаботится как о стандартном вводе, так и о стандартном выводе.Ваш вызов stdInput.readLine(); будет ждать, пока WE.EXE, и, следовательно, cmd.exe завершится, и в этот момент выходной поток будет закрыт (и вы, очевидно, не сможете писать в закрытый канал).

Итакесли вы хотите обрабатывать ввод и вывод самостоятельно, вы должны запустить WE.exe напрямую, например:

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

Кроме того, вы можете рассмотреть возможность использования ProcessBuilder вместо Runtime.exec.


Мелкие детали, но рассмотрите возможность использования Соглашения об именах Java - например, имя вашего класса будет Run2 (или что-то более описательное) вместо run2.

...