如何使用Java中子流程的OutputStream



我使用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();

当我尝试在子流程启动后在控制台中写入任何内容时,没有发生任何事情——正如预期的那样。我如何启用它,以便拥有一个交互式终端?

编辑:更具体地说,我正在尝试编写命令并将其发送到子流程。

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进程发送数据,这是您已经拥有的线程,一个等待用户键入内容,一旦用户点击回车键,就会将其发送给子进程,另一个等待子进程存在(process.waitFor()((。

最新更新