从外部进程读取输出

时间:2012-04-30 11:41:23

标签: java ipc

我正在尝试运行.csh脚本并将其输出读入StringBuffer。 尽管从控制台运行脚本返回一些输出,但输出有时返回空。相同的运行流有时可以返回输出,有时不会返回输出,尽管进程启动的方式没有任何改变(相同的脚本,路径,参数),脚本也不会更改。 我没有得到任何例外。 什么可能导致输出现在正确/成功读取? 代码段是

public static String getOutpoutScript(Process p) {
    InputStream outpout = p.getInputStream();
    logger.info("Retrived script output stream");
    BufferedReader buf = new BufferedReader(new InputStreamReader(outpout));
    String line = "";
    StringBuffer write = new StringBuffer();

    try {
        while ((line = buf.readLine()) != null) {
            write.append(line);
        }
    } catch (IOException e) {
        // do something
    }

    return write.toString().trim();

}

除了没有关闭流的事实不好,代码中的这个或其他东西可能会阻止在某些情况下正确读取输出吗?

感谢,

3 个答案:

答案 0 :(得分:0)

如果您使用ProcessBuilder启动它,您可以combine the error stream into the output stream.这样,如果程序打印到stderr,您也可以捕获它。或者你可以读两个。另外,你可能不想使用readLine,如果程序最后没有打印行尾字符,你可能会被卡住一段时间。

答案 1 :(得分:0)

也许您必须将p.getInputStream()替换为p.getOutputStream()

除此之外,有时进程可以阻止等待输入,因此您必须异步读写 - 一种可能的解决方案是使用不同的线程 - 例如一个线程正在读取,另一个正在写入,另一个正在监视该过程。

答案 2 :(得分:0)

如果您有错误,默认情况下会写入getErrorStream()。如果您遇到问题,我会确保您在某处阅读。

如果此流的缓冲区已满,则程序将停止,等待您阅读。

解决这些问题的一个简单方法是使用ProcessBuilder。redirectErrorStream(true)