【发布时间】:2019-03-16 01:05:53
【问题描述】:
我正在包装我经常与 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,然后相应地传递响应。
【问题讨论】:
-
我建议使用库github.com/remkop/picocli,或者看看stackoverflow.com/questions/367706/…。在读取命令行输入时,它会使您的实现更易于阅读且容易出错。