如何在java中使用子进程的outputstream?

zpgglvta  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(349)

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

当我尝试在子进程启动后在控制台中写入任何内容时,没有发生任何事情—正如预期的那样。如何启用它,使我有一个交互式终端?
编辑:更具体地说,我尝试编写命令并将它们发送到子进程。

9nvpjoqh

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() )).

相关问题