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

标签 java stream outputstream

我需要以用户可以与刚刚启动的程序交互的方式启动外部可执行文件。

例如,在 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);
}

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

zypper>

但无论我写什么,我的输入都不会影响启动的程序。 我怎样才能做我想做的事?

最佳答案

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

OutputStream out = proc.getOuptutStream();

此输出流通过管道传输到进程的标准输入流中,因此您只需写入它(也许您想先将其包装在 PrintWriter 中),数据将被发送到进程的标准输入。

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

API 引用:

关于java - 使用流重定向从 Java 代码启动外部可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4232307/

相关文章:

java - 合并网络摄像头流和视频文件并通过 RTP 或 RTSP 发送结果

java - 关闭 I/O 流

dart - 为什么BroadcastStream在Dart中不是一种类型?

java - 如何将类对象写入bin文件

Java 输出流 : Download Multiple Files

java - 从添加到 HTTP header 的数据中过滤掉特殊字符

java - 连接被拒绝 : connect Error in Java + Hibernate

java - 如何在 Java 中获取输出流的名称(即 stderr 或 stdout)?

java - 如何使用 DynamicJasper API 在页脚中添加页码选项?

java - 在 spring 中使用条件连接点