我使用processbuilder创建一个流程:
ProcessBuilder processBuilder = new ProcessBuilder(group.getExec().split(" "))
.redirectErrorStream(true));
Process process = processBuilder.start();
当前,我获取inputstream并使用以下命令将其显示到控制台:
InputStream std_out = process.getInputStream();
new Thread(() -> {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(std_out));
String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} catch(IOException e) {
e.printStackTrace();
}}).start();
当我尝试在子进程启动后在控制台中写入任何内容时,没有发生任何事情—正如预期的那样。如何启用它,使我有一个交互式终端?
编辑:更具体地说,我尝试编写命令并将它们发送到子进程。
1条答案
按热度按时间9nvpjoqh1#
group.getExec().split(" ")
这太脆弱了。为什么不直接过去group.getExec()
? processbuilder的这种特殊使用模式的“在空白处拆分”解析能力并不好,但至少比这更好。把它拿走.split(" ")
.BufferedReader reader = new BufferedReader(new InputStreamReader(std_out));
在web上搜索“java try with resources”,并在此处应用它;这是漏的。} catch(IOException e) {
e.printStackTrace();
这不是处理异常的方法。如果你不想处理这个问题,正确的“我只是不在乎”处理方法是throw new RuntimeException("Uncaught", e);
,因为这样可以保留有关问题的所有相关信息,并确保没有处于意外状态的代码执行。更具体地说,我正在尝试编写命令并将它们发送到子进程。
就像有一个
getInputStream()
,方法还有getOutputStream()
方法。如果您在这上面发送命令,就不能那么容易地将java进程的终端绑定到已启动的子进程。你不需要分离出一个单独的线程,你可以使用你所处的线程,但是如果你想单独响应退出的子进程,你需要3个线程(一个阻止子进程向你的java进程发送数据的线程——这是你已经有的线程,一个等待用户键入内容,一旦按下enter键,它就会将其发送到子进程,并等待子进程存在(process.waitFor()
)).