запустить интерактивную команду с помощью Apache Commons Exec - PullRequest
3 голосов
/ 17 августа 2010

Я хочу запустить интерактивную команду с помощью Apache Commons Exec.Все работает, за исключением того, что когда моя команда выполняется и ждет ввода пользователя, я не вижу свой ввод в консоли, пока не нажму клавишу ввода, что делает его практически непригодным для использования.

Это пример интерактивной программы:

public static void main(String[] args) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while (true) {
            System.out.print("=> ");
            try {
                line = in.readLine();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(line);
        }
    }

Теперь я хочу выполнить это с помощью Apache Commons Exec следующим образом:

public static void main(String[] args) {
    Executor ex = new DefaultExecutor();
    ex.setStreamHandler(new PumpStreamHandler(System.out, System.err, System.in));
    CommandLine cl = new CommandLine("java");
    cl.addArguments("-cp target\\classes foo.bar.Main");

    try {
        ex.execute(cl);
    } catch (ExecuteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Как я уже сказал, это в основном работает, я получаю приглашение "=>", но когда я набираючто-то, чего я не вижу, пока не нажму "войти".Я делаю это на Windows 7 с подсказкой cmd.Буду признателен за любую подсказку о том, как добиться желаемого поведения.

Редактировать: Он работает, как и ожидалось, в Linux .Я предполагаю, что это проблема с приглашением Windows cmd.Я все еще хотел бы сделать эту работу, если это вообще возможно, поэтому я был бы признателен за понимание этого поведения в Windows.

Edit2: Я также тестировал с оболочкой msys и powershell, оба демонстрируют одну и ту же проблему.

Edit3: я обошел проблему, запустив отдельное приглашение cmd.Это работает, но мне все еще нравится понимать, почему.

CommandLine cl = new CommandLine("cmd");
cl.addArguments("/C java -cp target\\classes foo.bar.Main");

спасибо

Рауль

Ответы [ 2 ]

2 голосов
/ 17 августа 2010

Я не уверен, что именно вы ожидали здесь произойти;если порожденный процесс предназначен для ожидания чтения из своего ввода, то неудивительно, когда он делает именно это?

Если это проблема, и ваш вопрос «Как я могу сделать свою программу автоматическиотправьте символ новой строки на вход «порожденного процесса?», затем вам нужно будет определить OutputStream для записи ввода и получить ExecuteStreamHandler, чтобы присоединить его к процессу.Примерно так:

Executor ex = new DefaultExecutor();

// Create an output stream and set it as the process' input
OutputStream out = new ByteArrayOutputStream();
ex.getStreamHandler().setProcessInputStream(out);
...
try
{
    ex.execute(cl);
    out.write("\n".getBytes()); // TODO use appropriate charset explicitly
...
0 голосов
/ 20 марта 2011

Используя Apache exec org.apache.commons.exec.DefaultExecuteResultHandler, вы можете запустить неблокирующую команду.И тогда вы можете выполнить указанные действия @Andrzej.

...