Java使用输入流从外部程序读取标准输出

标签 java io

我正在尝试开发一个读取外部程序标准输出的类(使用 Process、Runtime.getRuntime().exec(cmdLine, env, dir) 的实例)。 该程序在此过程中接受用户输入,并且在给出有效输入之前不会继续;这似乎导致我尝试读取其输出的方式出现问题:

    egm.execute(); // run external the program with specified arguments
    BufferedInputStream stdout = new BufferedInputStream(egm.getInputStream());
    BufferedInputStream stderr = new BufferedInputStream(egm.getErrorStream());
    BufferedOutputStream stdin = new BufferedOutputStream(egm.getOutputStream());



    int c; //standard output input stream
    int e; //standadr error input stream

    while((c=stdout.read()) != -1) //<-- the Java class stops here, waiting for input? 
    {
        egm.processStdOutStream((char)c); 
    }
    while((e=stderr.read()) != -1)
    {
        egm.processStdErrStream((char)e);
    }
    //...

我该如何解决这个问题,以便程序接受有效输入并继续执行?解决这个问题的任何帮助都会很棒!

最佳答案

必须同时使用程序的 stdout 和 stderr 以避免阻塞情况。

参见 this article有关详细信息,请特别注意 StreamGobbler 机制,该机制在单独的线程中捕获 stdout/err。这对于防止阻塞是必不可少的,如果您没有正确执行此操作,则会成为许多错误的根源!

关于Java使用输入流从外部程序读取标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1088941/

相关文章:

java - 为什么将 Collections.emptySet() 与泛型一起使用在赋值中而不是作为方法参数?

c - 为什么 getchar 调用 printf 停止工作?

io - 在 Rust 中是否有丢弃输入的标准方法?

Java IO,从文件读取并打印到二维字符数组

java - 如何在apache spark java中使用hadoop office库将数据集写入excel文件

url 连接中的 java.lang.nullpointerException

java - 如何从 java struts 1.1 应用程序覆盖 Tomcat 的 xml 文件属性。特别是 maxPostSIze

java - 无法使用 swt Transform 旋转透明图像

ruby - 文件的所有行都在彼此打印

java - RMI传输文件