0

我正在尝试运行 .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();

}

除了不关闭流这一事实之外,代码中的这个或其他内容是否可能会阻止输出在某些情况下被正确读取?

谢谢,

4

3 回答 3

0

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

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

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

于 2012-04-30T11:48:19.653 回答
0

如果您使用 ProcessBuilder 启动它,您可以将错误流合并到输出流中。这样,如果程序打印到 stderr,您也将捕获它。或者,您可以同时阅读两者。此外,您可能不想使用 readLine,如果程序最后没有打印行尾字符,您可能会卡住一段时间。

于 2012-04-30T11:47:20.023 回答
0

也许你必须替换p.getInputStream()p.getOutputStream()

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

于 2012-04-30T11:47:31.067 回答