processbuilder java process builder:使用来自命令行的用户输入运行程序
我需要使用process builder运行shell脚本或系统命令。在某些情况下,该命令将要求用户输入。例如,我有一个java程序“TestScanner”,它从命令行获取一个整数并打印出来。如果我直接在终端上运行它
$bash -c "java TestScanner"
Enter a number:3
Number entered:3
$
程序显示信息以供输入。然后我输入“3”,然后它打印出结果,程序终止
现在我需要运行命令
bash -c "java TestScanner"
来自java process builder。代码是
// cmdList has 3 elements: bash, -c, java TestScanner
ProcessBuilder pb = new ProcessBuilder(cmdList);
pb.redirectErrorStream(true);
pb.directory(new File(workDir));
Process p = pb.start();
InputStream in = p.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = null;
while ((line = br.readLine()) != null)
{
System.out.println("Line: " + line);
}
当我运行上面的代码片段时,它就挂在那里。我甚至看不到“输入一个数字”的信息。我不确定这是否是因为p.getOutputStream()正在等待?如何检测程序是否请求输入?我尝试了这里的代码片段Java Process with Input/Output Stream,但在我的情况下不起作用。谢谢
# 1 楼答案
在学习了MadProgrammer的精彩教程(参见他的评论)之后,我看到了我的问题中发生了什么
在这里,BufferedReader试图读取一行(以EOL终止),但在用户向OutputStream输入内容并按下Enter键之前,process对象返回的InputStream从未到达EOL。这就是为什么提示信息“输入一个数字”没有出现。将读取方法更改为
在while循环中,将显示提示消息。然后问题是如何检测用户输入。当用户输入某个内容并按enter键时,数据位于OutputStream的缓冲区中。我们需要实现的是“感知”输出流中有东西的逻辑,它需要被写入和刷新。在我的例子中,我有一个SWT文本供用户输入数据,所以我添加了一个SWT。DefaultSelection事件侦听器发送到文本控件以响应键盘输入。然后我看到了正确的程序输出