有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    在学习了MadProgrammer的精彩教程(参见他的评论)之后,我看到了我的问题中发生了什么

    InputStream in = p.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String line = null;
    while ((line = br.readLine()) != null) {...}
    

    在这里,BufferedReader试图读取一行(以EOL终止),但在用户向OutputStream输入内容并按下Enter键之前,process对象返回的InputStream从未到达EOL。这就是为什么提示信息“输入一个数字”没有出现。将读取方法更改为

    is.read() != -1
    

    在while循环中,将显示提示消息。然后问题是如何检测用户输入。当用户输入某个内容并按enter键时,数据位于OutputStream的缓冲区中。我们需要实现的是“感知”输出流中有东西的逻辑,它需要被写入和刷新。在我的例子中,我有一个SWT文本供用户输入数据,所以我添加了一个SWT。DefaultSelection事件侦听器发送到文本控件以响应键盘输入。然后我看到了正确的程序输出