我包装了经常与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,然后相应地传递响应。
答案 0 :(得分:1)
在派生子进程时,它需要从父进程继承I / O才能进行stdin
和stdout
的交谈。使用ProcessBuilder.inheritIO在stdin,stdout和stderr中重定向命令流。