Общение с процессом C ++ из Java - PullRequest
0 голосов
/ 26 декабря 2010

Во-первых, я увидел несколько вопросов об этой проблеме на сайте, но не нашел ответа, который решил бы мою проблему.

У меня есть программа, написанная на Java, и она вызывает программу cmd, написанную на C ++. (это предположение, поскольку у меня нет фактического источника) Я знаю ожидаемый ввод-вывод программы C ++, в cmd это две строки вывода, а затем он ожидает ввода строки. Я знаю, что первая строка вывода программы проходит через поток ошибок, и я получаю его правильно (это ожидается), но я не получаю вторую строку с ошибкой или потоком ввода. Я пытался записать в программу сразу после первой строки (строка ошибки) и не застрял, но ответа не было. Я попытался использовать 3 разных потока для каждого потока, но опять же ничего не было получено в потоке ввода / ошибок после первой строки, и программа не отвечала на запись через выходной поток.

Мои инициализаторы:

Process p = Runtime.getRuntime().exec("c:\\my_prog.exe");
BufferedReader err = new BufferedReader(new InputStreamReader(p.getErrorStream()));
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));

Возможно ли это вообще или, может быть, это зависит от программы на C ++?

Спасибо, Биньямин

Ответы [ 3 ]

0 голосов
/ 26 декабря 2010

Я бы посоветовал поместить ввод в программу, когда она запустится, он, вероятно, будет использовать ее как ввод, когда захочет.

0 голосов
/ 26 декабря 2010

Вот как я выполняю любую командную строку в Java. Эта командная строка может выполнить любую программу:

private String executionCommandLine(final String cmd) {

    StringBuilder returnContent = new StringBuilder();
    Process pr;
    try {
        Runtime rt = Runtime.getRuntime();
        pr = rt.exec(cmd);

        BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));

        String line = null;

        while ((line = input.readLine()) != null) {
            returnContent.append(line);
        }
        input.close();
        LOG.debug(returnContent.toString());

        // return the exit code
        pr.waitFor();
    } catch (IOException e) {
        LOG.error(e.getMessage());
        returnContent = new StringBuilder();
    } catch (InterruptedException e) {
        LOG.error(e.getMessage());
        returnContent = new StringBuilder();
    }

    return returnContent.toString();

}
0 голосов
/ 26 декабря 2010

Если вы хотите вызывать собственные приложения, такие как C и C ++, из Java, вам нужно использовать JNI.

...