使用流重定向从Java代码启动外部可执行文件

Iva*_*tyk 6 java outputstream stream

我需要以这样的方式启动外部可执行文件,即用户可以与刚刚启动的程序进行交互.

例如在OpenSuse Linux中有一个包管理器--Zypper.您可以在命令模式下启动zypper,并为其提供安装,更新,删除等命令.

我希望以用户可以与之交互的方式从Java代码运行它:输入命令并查看他启动的程序的输出和错误.

这是我尝试使用的Java代码:

public static void main(String[] args) throws IOException, InterruptedException {
    Process proc = java.lang.Runtime.getRuntime().exec("zypper shell");

    InputStream stderr = proc.getInputStream();
    InputStreamReader isr = new InputStreamReader(stderr);
    BufferedReader br = new BufferedReader(isr);
    String line = null;
    char ch;

    while ( (ch = (char)br.read()) != -1)
        System.out.print(ch);

    int exitVal = proc.waitFor();
    System.out.println("Process exitValue: " + exitVal);
}
Run Code Online (Sandbox Code Playgroud)

但不幸的是我只能看到它的输出:

zypper>
Run Code Online (Sandbox Code Playgroud)

但无论我写什么,我的输入都不会影响已启动的程序.我该怎么办?

Gro*_*uez 2

您需要获取输出流才能写入进程:

OutputStream out = proc.getOuptutStream();
Run Code Online (Sandbox Code Playgroud)

该输出流通过管道传输到进程的标准输入流,因此您可以直接写入它(也许您想将其包装在第一个PrintWriter),并且数据将被发送到进程的标准输入。

请注意,获取错误流 ( proc.getErrorStream) 以便读取进程写入其 stderr 的任何错误输出也可能很方便。

API参考: