在外部进程Java中处理交互式提示

时间:2019-03-15 16:06:19

标签: java process

我包装了经常与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 个答案:

答案 0 :(得分:1)

在派生子进程时,它需要从父进程继承I / O才能进行stdinstdout的交谈。使用ProcessBuilder.inheritIO在stdin,stdout和stderr中重定向命令流。