Обработка интерактивных подсказок во внешнем процессе Java - PullRequest
0 голосов
/ 15 марта 2019

Я обертываю приложение командной строки, которое я часто использую с интерфейсом GUI. В основном все сводится к его выполнению (как к процессу Java), а затем к анализу его ответов. Однако один из вариантов использования требует от конечного пользователя принятия дополнительных действий (приложение спрашивает, хочет ли пользователь перезаписать файл), и я не уверен, как с этим справиться. Как InputStream, так и ErrorStream зависает, как только появляется это приглашение. Вот (довольно общий) код метода executeCommand:

private void executeCommand(String command) {

    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.command("bash", "-c", command);
    try {

        Process process = processBuilder.start();

        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));

        String line = null;

        while ((line = reader.readLine()) != null) {
           //some actions "File already exists. Do you want to overwrite ? [y/N]" line never gets to this point
        }

        while ((line = errorReader.readLine()) != null) {
           //some actions "File already exists. Do you want to overwrite ? [y/N]" line never gets to this point
        }
        handleExitCode(process.waitFor(),"Success!");

    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Я предполагаю, что «Файл уже существует. Вы хотите перезаписать? [Y / N]» приглашение передается через какой-то другой канал. Я просто не знаю, как справиться с этим. Для меня идеальным сценарием было бы, если бы я мог запросить messageBox с тем же вопросом и затем передать ответ соответствующим образом.

1 Ответ

1 голос
/ 15 марта 2019

Когда вы разветвляете дочерний процесс, он должен наследовать ввод-вывод от родительского процесса для разговора stdin и stdout. Используйте ProcessBuilder.inheritIO для перенаправления ваших командных потоков в ваши stdin, stdout и stderr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...